使用C字符串的scanf和strcmp函数

3

我找到了一个不错的使用strcmp的示例,但它只适用于fgets(),我需要使其适用于scanf。所以,这是代码:

int main(void) {
char fruit[] = "apple\n";
  char ans[80];
  do {
     printf ("Guess my favorite fruit? ");
     scanf ("%s",ans);
  } while (strcmp (fruit, ans) != 0);
  puts ("Correct answer!");
  return 0;
}

即使我写了正确的答案(“apple”),它仍然停留在循环中,并继续问我最喜欢的水果是什么...我猜这与未在ans [80]中编写的字符有关(我需要将其作为最多具有80个字符的字符数组)。我不理解这一点...
提前致谢。

如果您不明白,显而易见的方法是将这两个字符串打印出来,然后进行视觉比较... - Karoly Horvath
3个回答

3

Scanf会忽略"\n",所以你需要初始化char fruit[] = "apple",因为ans永远不会以'\n'结尾。

P.S: 对于scanf的解释:任意数量的非空白字符,直到找到第一个空白字符为止。在存储的序列末尾自动添加一个终止空字符。


没错,你说得对,去掉“\n”就正常了,我从来没有想到!谢谢。 - Daniel Mendonça
scanf() 不会忽略 \n。格式说明符 "%s" 指示 scanf() 跳过输入的空白字符,然后匹配并保存一系列非空白字符,直到找到一个空白字符(例如 \n)。这个空格将被放回到 stdin 中以供后续 IO 操作使用。 - chux - Reinstate Monica
@chux 是的,更准确地说,scanf会在空格处停止。 - notbad

1

scanf() 不会将尾随的换行符写入 ans。而 strcmp() 在比较时会考虑换行符,因此它不匹配您的字面值,其中包括换行符。


0
"scanf"函数会将换行符"\n"作为输入,因此您无法将两个字符串相等。如果您想要使两个字符串相等,您需要从第一个字符串中删除换行符"\n"("apple"是可以的)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接