【问题标题】:while(scanf) is infinite looping?while(scanf) 是无限循环吗?
【发布时间】:2015-11-17 00:44:00
【问题描述】:

该代码应该接受一行包含不同字符的用户输入,然后打印出仅包含字母的一行。例如, Cat8h08er64832&*^ine 将是凯瑟琳。但是,代码可以运行并输出“Catherine”,但是程序没有退出...see picture here我不确定循环是无限循环还是...

int main(void){

  int i=0, j=0;
  char userString[1000];
  char alphabet[1000];

  printf("Please enter a string: ");

  while(scanf("%c", &userString[i])){
    if((userString[i]>='A' && userString[i]<='Z')||(userString[i]>='a'&&userString[i]<='z')){
        alphabet[j]=userString[i];
        printf("%c", alphabet[j]);
        j++;
     }
     i++;
   }
   printf("\n");
   return 0;
}

【问题讨论】:

  • 循环没有退出条件。退出条件应该是什么?
  • scanf 在输入结束时返回EOF(当您键入Ctl-d 时)。你不是在检查那个。 %c 运算符永远不会返回 0 次转换,因为任何字符都匹配它。
  • 我认为 while(scanf("%c", &userString[i])) 会循环直到用户输入结束(回车键)?不是吗?
  • @Barmar 哦,我觉得这很有意义。
  • 如果要读取单行输入,请使用fgets 读取数组。然后循环遍历数组的字符。

标签: c loops while-loop scanf infinite


【解决方案1】:

您的问题是您通过检查返回值0 来检查scanf 是否已完成。当没有更多输入时,scanf 返回 EOF(通常为 -1)。所以如果你得到一些输入(返回 1)然后没有更多的输入(返回 -1),你的循环将永远不会退出。

更改scanf 条件以检查&lt;&gt; EOF

This answer也解释的很好。

【讨论】:

  • while(scanf("%c", &userString[i]) != EOF) 也不能正常工作。这是因为 %c 接受回车键 (\n) 作为有效输入,并且没有识别出我希望它在按下回车键后终止?
  • 听起来很可能。 scanf 很难处理人工输入。您可能需要检查多个终止值和错误条件。
  • 我最终使用 fgets 并在那里循环。无论如何,感谢您的所有帮助。
  • 好东西。 fgets 可以保护您免受 scanf 中的一些陷阱。
猜你喜欢
  • 2022-01-22
  • 2016-06-05
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
  • 2015-06-25
  • 2011-07-14
  • 2013-10-12
  • 1970-01-01
相关资源
最近更新 更多