scanf不会让我离开循环 - 任何想法为什么以及如何解决它?

时间:2015-10-18 18:29:23

标签: c loops scanf

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,或者只在终端输入一个单词而不是两个单词?

1 个答案:

答案 0 :(得分:2)

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

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

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

使用fgets()sscanf()有很多优点 - 请继续使用。