在C中每循环迭代读取三个字符?

时间:2012-09-18 00:34:53

标签: c input io getchar

这对我没有意义,但希望你们其中一个人理解为什么要这样做。

我有一个赋值,需要用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一样奇怪它会终止循环吗?

3 个答案:

答案 0 :(得分:1)

getchar是一个阻止调用,因此在读取字符或遇到EOF之前不会返回。

因此,在相应的c1调用之后检查c2c3getchar是否为换行符(以查看输入行是否有结束),或按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进行比较了。