我正在尝试用白色空格分隔的单词。存在未知数量的单词,并且将有多行输入。我想一次读两个单词,然后在继续之前比较它们。
现在阅读和比较工作得很好,但是我没有设法找到一种方法,一旦它到达文件末尾就退出循环并继续提示新输入。
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,因为我不认为它与我的问题有关。但我可以编辑并包括它是否恰好。
答案 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
表示错误。