以下代码不起作用:
char text[10];
scanf(" %s", &text);
if (strcmp(text, "some text") == 0)
puts("some text");
但是当我这样更改'if part'时,一切都很好:
if (strcmp(text, "sometext") == 0)
为什么这样工作,以及如何解决?
问题不是您的strcmp
通话,而是您的scanf
通话!当您输入some text
作为输入时,scanf
将停止在第一个空格处读取,因此您的text
字符串将是“ some”-因此,strcmp
调用将(正确)返回非零值,因为它与[某些文本] not相同。
有关scanf
,空格和%s
格式的此功能的更多信息,请参见本主题:How do you allow spaces to be entered using scanf?
调用fget读取空白,并将字符串与strncmp进行比较:
fgets (text, 100, stdin);
puts(text);
if (strncmp(text, "some text",9) == 0)
puts("some text");
我的答案将是不询问论坛qwuestions而是对此类问题进行排序。我需要2-3分钟才能看到发生了什么:
int main()
{
char text[10];
int result;
result = scanf(" %s", &text);
printf("scanf result: %d, scanned text: \"%s\"\n", result, text);
if (strcmp(text, "some text") == 0)
puts("some text");
}
调试-即找到问题的根源与编程知识同样重要。如果您自己添加此单行,则可以立即自行解决此问题。
主题外,但评论太久。
您的scanf
行实际上是错误的(不涉及空格),您很幸运它在这里有效。您需要删除&
前面的与号text
。您已将text
的地址传递给scanf
,该地址实际上是指向char[10]
的指针。对于scanf(" %s", text);
,text
“衰减”到指向您实际想要的第一个元素(char*
)的指针。在这里,恰好发生了数组(&text
)的地址与数组中第一个元素(&(text[0]
或*(text + 0)
)的地址相同的情况,因为它们都自动存储在同一地点。例如,如果您有类似的东西
char* text = malloc(10);
scanf(" %s", &text);
您将通过覆盖指向malloc
的内存的指针的地址开始的内存来调用未定义的行为。在这里,文本的地址是指向自动存储中的指针的地址,而实际上指向的内存则位于其他位置。您可以在以下程序中看到此说明。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char text[10];
char* text2 = malloc(10);
printf("address of text = %p\n", (void*)(&text));
printf("address of text[0] = %p\n", (void*)(&(text[0])));
printf("address of text2 = %p\n", (void*)&text2);
printf("address of text2[0] = %p\n", (void*)(&(text2[0])));
return 0;
}
&text == &(text[0])
,表示数组的地址与数组的第一个元素的地址相等,但是&text2 != &(text2[0])
,表示指针的地址不等于您的内存的第一个元素的地址'vemalloc
ed。