如何让scanf循环在到达文件末尾时终止?

时间:2016-05-26 02:43:48

标签: c while-loop scanf c89

我正在尝试用白色空格分隔的单词。存在未知数量的单词,并且将有多行输入。我想一次读两个单词,然后在继续之前比较它们。

现在阅读和比较工作得很好,但是我没有设法找到一种方法,一旦它到达文件末尾就退出循环并继续提示新输入。

int main() {

char entry1[256];
char entry2[256];

printf("Enter some test words: \n");

while(scanf("%257[^ \t\n]%*c", entry1)){
    printf("compare 1: %s \n", entry1);

    scanf("%257[^ \t\n]%*c", entry2);
    printf("compare 2: %s \n", entry2);

    if ((anagramCheck(entry1, entry2)) == 1) 
        printf("\nThese two words are anagrams.\n");
    else
        printf("\nThese two words are not anagrams.\n");
}
}

这就是我想要实现的目标:

示例输入可能是:

table george creative reactive tabloid pipe

输出结果为:

compare 1: table
compare 2: george

These two words are not anagrams.

compare 1: creative
compare 2: reactive

These two words are anagrams.

compare 1: tabloid
compare 2: pipe

These two words are not anagrams.

注意: - 我正在编译c89。 - 我没有包括anagramCheck,因为我不认为它与我的问题有关。但我可以编辑并包括它是否恰好。

1 个答案:

答案 0 :(得分:1)

通常的习语是

while (scanf("%255s%255s", entry1, entry") == 2) {
  printf("Compare 1: %s\nCompare 2: %s\n", entry1, entry");
  // ...
}

当它无法读取两个单词时将停止。我不清楚你希望用更复杂的scanf模式完成什么,而你只能使用%s来完成。 (我将你的257改为255,因为这是你可以在256字节字符数组中容纳的最大字符数。)

请注意,scanf在出错时返回EOF(通常为-1),就C而言,这是一个真值。使用while (scanf(...)) { ... }几乎绝不是一个好主意,因为这会导致循环在错误或文件结束时继续。

来自Linux系统上的man scanf

  

这些函数返回成功匹配和分配的输入项的数量,可以少于提供的数量,或者在早期匹配失败的情况下甚至为零。

     

如果在第一次成功转换或匹配失败发生之前到达输入结尾,则返回值EOF。如果发生读取错误,也会返回EOF,在这种情况下,将设置流的错误指示符,并设置errno表示错误。