char类型数组使用什么操作数?

时间:2015-04-23 07:09:16

标签: c

我遇到了一个愚蠢的问题,我只能掌握它。   有一个简单的C代码(只想查找字符串str1是否以str2开头):

int main()
{
    int i, j; 
    char sir1[150], sir2[150], sir3[150];
    printf("insert the first string (sir1) and then hit ENTER \n");
    gets(sir1);
    printf("insert the second string (sir1) and then hit ENTER \n");
    gets(sir2);
    printf("\n");
    int len_sir2=strlen(sir2);
    for (i=0;i<len_sir2;i++)
    {
        sir3[i]=sir1[i];
    }

    for (j=0;j<len_sir2;j++)
    {
        if (sir3[i]!=sir2[i]){printf("String 1 does not start with String 2\n");break;return 0;}
    }
    printf("Sir1 starts with Sir2 \n");
    getch();    
}

我的问题是,例如&#34; bananna&#34;和&#34; ana&#34;,代码似乎对sir2 [0]和sir3 [0]具有相同的值,即使在Quick Watch中显示的值是98&#39; b&#39;和97&#39; a&#39;。我做错了什么? 非常感谢,

3 个答案:

答案 0 :(得分:9)

一个错误是你循环j,但你在循环中使用i

for (j=0;j<len_sir2;j++)
    {
        if (sir3[i]!=sir2[i]){printf("String 1 does not start with String 2\n");break;return 0;}
    }

答案 1 :(得分:1)

永远不会达到声明return 0;。你以前打破了循环。

if (sir3[i]!=sir2[i])
{
  printf("String 1 does not start with String 2\n"); 
  break;  // <- not needed
  return 0;
}

答案 2 :(得分:0)

您应该意识到startsWith()可以简单地实现:

int startsWith (char *a, char *b) {  // a.startsWith(b)
    return (strncmp (a, b, strlen (b)) == 0);
}

这比手动迭代每个字符有点“干净”(只是确保你没有在任何“真实”代码中使用gets,它会打开缓冲区溢出问题):

#include <stdio.h>
#include <string.h>

int startsWith (char *a, char *b) {  // a.startsWith(b)
    return (strncmp (a, b, strlen (b)) == 0);
}

int main (void) {
    char sir1[150], sir2[150];

    printf ("insert the first string (sir1) and then hit ENTER \n");
    gets (sir1);
    printf ("insert the second string (sir1) and then hit ENTER \n");
    gets (sir2);
    putchar ('\n');

    if (startsWith (sir1, sir2))
        printf ("sir1 starts with sir2 \n");
    else
        printf ("Sir1 does not start with sir2 \n");

    return 0;
}