strcmp仅在循环开始时起作用

时间:2016-09-20 21:09:16

标签: c arrays string char strcmp

我一直在尝试创建一个简单的程序,它循环遍历数组的成员并扫描字符,寻找一组特定的字符。我遇到了strcmp()仅在循环开始时起作用的问题。我很难理解为什么会发生这种情况,任何帮助都会受到赞赏。

char *file[3] = {"!x", "!!x", "x!"};

for (int i = 0; i < sizeof(file) / sizeof(file[0]); i++) {
  char *line = file[i];
  printf("\n");
  for (int i = 0; i < strlen(line); i = i + 1) {
    char character = line[i];
    if (strcmp("!", &character) == 0) {
      printf("[YES] %c\n", character);
    } else {
      printf("[NO] %c\n", character);
    }
  }
}

输出

[YES] !
[NO] x

[YES] !
[NO] !
[NO] x

[NO] x
[NO] !

3 个答案:

答案 0 :(得分:2)

strcmp函数需要以null结尾的字符串的地址。相反,你传递的是char的地址。 strcmp然后尝试读取character之后的内存位置,结果为undefined behavior

但真正的问题是你不想比较字符串。你想比较字符。

if (character == '!') {

答案 1 :(得分:1)

问题在于,您向strcmp()提供了错误的参数,&character不是指向字符串的指针

引用C11,int strcmp(const char * s1,const char * s2);

  

int strcmp(const char *s1, const char *s2);

     

strcmp函数将s1指向的字符串与指向的字符串进行比较   s2

因此,它希望两个参数都是 string 类型,在你的情况下不是。

您只需使用比较运算符==来比较char,例如

 if (line[i] == '!')  //notice the '' s, they are not ""s

等等。

答案 2 :(得分:0)

strcmp()比较空终止字符串。在代码中:

char character = line[i];
if (strcmp("!", &character) == 0) 

character不是以空字符结尾的字符串。它是偶然的,它是偶然的。

你需要更像这样的东西来比较字符串:

char character[2] = { line[i], '\0' };
if (strcmp("!", character) == 0) 

或者像这样比较字符:

char character = line[i];
if (character == '!')