这对我没有意义,但希望你们其中一个人理解为什么要这样做。
我有一个赋值,需要用getchar()读取三个字符,因为彼此相邻的三个整数彼此相关,所以我设置了一个如下结构的循环:
int c1, c2, c3 = 0;
while(c3 != EOF) {
c1 = getchar();
c2 = getchar();
c3 = getchar();
... do something with them...
}
问题是如果字符数不能被3整除,则不执行最后一次迭代。所以,如果角色" Abcd"输入后,它会对Abc进行第一次迭代,但是第二次迭代不会对D做任何事情。对于" Abcde",但是Abcdef可以工作。
这是一项家庭作业,所以不要为我解决这个问题,但是如果找不到很多字符的话,这就像getchar一样奇怪它会终止循环吗?
答案 0 :(得分:1)
getchar
是一个阻止调用,因此在读取字符或遇到EOF之前不会返回。
因此,在相应的c1
调用之后检查c2
,c3
或getchar
是否为换行符(以查看输入行是否有结束),或按Ctrl+D
(* nix,OS X)或Ctrl+Z
(Windows)发出文件结束(EOF)信号。在EOF之后,getchar
将始终立即返回EOF
。
答案 1 :(得分:0)
将您的问题分解为州。定义在不同状态下对不同输入应该做什么。转换为代码。
在您的情况下,您需要弄清楚何时输入不需要的长度会影响您以及如何处理它。阅读三胞胎可以很好地工作,但对于你得到的每一个角色,你需要看看是否应该提出错误或以特殊的方式对待它。
尝试通过您描述的状态运行字符串""
,"a"
,"ab"
,"abc"
和"abcd"
,看看是否可以全部处理它们一个理智的方式。当这工作时,编写代码应该不是问题。
答案 2 :(得分:0)
模拟短文件的简单方法是在程序中使用echo和pipe:
echo ABC | ./program_name
这样,您可以在命令行上使用不同的字符串进行测试。 echo的输出将通过管道输出到程序的标准输入。程序中的标准输出将在字符串结尾处关闭。这样可以避免在直接使用键盘测试时导致getchar阻塞的EOF问题(除了终端行/字符输入法)。
另一个问题是EOF是一个int常量。因此,请检查您的代码是否稍后不将c1,c2,c3转换为char。没关系,但是如果你把它们转换为char,就不能再与EOF进行比较了。