0

下面的程序有什么问题(这里发生了什么)?它应该在用户插入空字符串(仅按 ENTER)后打破 for 循环,但在我的情况下,它以无限 for 循环结束。我尝试了评论中的内容,但没有成功。

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

struct S {
  char str [10];
};

int main(void)
{
  int n;
  struct S strings [10];
  for (n = 0; n < 10; n++) {
    # fflush(stdout);
    scanf("%s", strings[n].str);
    if (strlen(strings[n].str) == 0)
      break;
    # getchar();
  }
  printf("done");
  return 0;
}

当我scanfgets(strings[n].str); done替换时,永远不会打印。你会如何解决它?

示例解决方案有效。与我的代码相比有什么不同吗?

4

4 回答 4

5

回车键不是空字符串,它是一个 ascii 字符,或者更确切地说是 CR 和 LF 两个字符(在 Windows 上)。

于 2012-05-29T10:20:01.357 回答
2

您不应该使用 strlen 来确定输入是否为空。正如其他人所说,当您按 ENTER 时,您会收到一两个字符。

您可以改为检查字符串中的第一个字符,看看它是否是'\n''\r'

于 2012-05-29T10:34:30.967 回答
1

scanf准确返回您输入的内容...即我想象的一对 crlf!

于 2012-05-29T10:20:49.063 回答
1

using 的问题scanf是它需要一些东西,而不是空字符串。您可以通过使用 egfgets而不是来解决这个问题scanf

if (fgets(strings[n].str, sizeof(strings[n].str), stdin))
{
    /* You got a string, it will contain the newline! */
}
于 2012-05-29T10:26:27.930 回答