【问题标题】:scanf won't let me leave loop — any idea why and how to fix it?scanf 不会让我离开循环 - 知道为什么以及如何解决它吗?
【发布时间】:2015-10-18 18:29:23
【问题描述】:
int main() {
  char one[50]; char two[50];
  while (scanf("%10s %10s",one,two) == 2){
    printf("%s %s\n",one,two);
  }
}

函数不会让我离开循环

Charanas-MacBook-Pro:Testing zone Charana$ ./a.out
first second 
first second
one two
one two
one 
two
one two


leave

知道如何解决这个问题,以便我可以在换行时留下scanf,或者在终端中只输入一个单词,而不是两个?

【问题讨论】:

  • scanf 不知道换行符。它将继续扫描,直到找到两个单词,无论它们分布在多少行。如果您想要真正的基于行的输入,请使用fgetsgetline 等非标准模块来读取一行,然后扫描该行。
  • 或使用文件结束符,如Ctrl-Z(Windows 控制台)或Ctrl-D(Linux)。
  • @M Oehm scanf() 确实“知道”类似的中断 - ti 取决于说明符。如果有的话,scanf("%s... 不会区分换行符和空格。同意最好使用``fgets()/getline()`。

标签: c loops scanf


【解决方案1】:

scanf() 函数在通过%s 读取字符串之前会跳过空格。换行符是空白。因此,它会继续读取,直到获得第二个字符串。与数字类似;如果您要求输入两个数字,scanf() 将不会停止读取,直到它得到两个数字,或者它遇到一个不能成为数字一部分的字符 - 它非常高兴地读取换行符。

如果你想要基于行的输入,不要使用scanf();使用标准 C 中的 fgets()getline() 来自 POSIX,再加上 sscanf()。然后你就可以得到理智的行为。

就目前而言,scanf() 函数完全按照它的预期工作;在它有第二个字符串之前它不会完成。您可以中断程序,但这通常不是您想要的。您可以发出 EOF 信号(例如,通过在类 Unix 平台上键入 Control-D 或在 Windows 上键入 Control-Z),但这可能会导致更多问题 - 您必须清除例如,在您获得进一步输入之前的 EOF 条件。

使用fgets()sscanf() 有很多优点——去吧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 2021-08-11
    • 2016-06-08
    • 1970-01-01
    • 2020-07-13
    相关资源
    最近更新 更多