2016-09-20 65 views
0

我一直在试图创建一个简单的程序,循环遍历数组的成员,并扫描字符寻找一组特定的字符。我遇到了一个问题,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] ! 
+0

为什么使用**字符串**比较函数来比较单**字符**? – Olaf

+0

你可能有未定义的行为:没有什么能保证char上的指针在某处附近有一个零,因为它不是一个字符串。 –

+0

这里关于一个空终止字符串的评论当然是正确的。这种行为仍然看起来很奇怪,因为在这种情况下,我们知道'&character'后面是什么,因为我们知道字符串中其余的字符。我不清楚为什么它以这种特定的方式行事不端。 – Brick

回答

2

strcmp函数需要一个空的地址终止的字符串。相反,你要通过它的地址charstrcmp然后尝试读取过去character的内存位置,导致undefined behavior

然而,真正的问题是你不想比较字符串。你想比较字符。

if (character == '!') { 
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 == '!') 
1

这里的问题是,你提供错误的参数strcmp()时, &character不是指向字符串的指针。

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

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

strcmp函数比较字符串指向s1到字符串由 s2指向。

因此,预计双方的观点是型,而你的情况是不是的。

您可以简单地使用比较运算符==比较char S,像

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

等。