4

这对我来说毫无意义,但希望你们中的一个人理解它为什么这样做。

我有一个作业需要使用 getchar() 读取三个字符,因为三个相邻的整数彼此相关,所以我设置了一个循环结构如下:

int c1, c2, c3 = 0;

while(c3 != EOF) {
    c1 = getchar();
    c2 = getchar();
    c3 = getchar();
    ... do something with them...
}

问题是如果字符的数量不能被三整除,最后的迭代就不会执行。因此,如果输入字符“Abcd”,它将在 Abc 上执行第一次迭代,但第二次迭代不会对 D 执行任何操作。“Abcde”也是如此,但 Abcdef 会起作用。

这是一个家庭作业,所以不要为我解决这个问题,但是如果没有找到那么多字符,它只是终止循环,这对于 getchar 是否有些奇怪?

4

3 回答 3

1

getchar是一个阻塞调用,所以它在读取字符或遇到 EOF 之前不会返回。

因此,要么检查是否有c1c2要么c3是相应getchar调用之后的换行符(查看输入行是否已结束),或按Ctrl+D(*nix, OS X) 或Ctrl+Z(Windows) 来表示结束-文件(EOF)。在 EOF 之后,getchar总是会立即返回EOF.

于 2012-09-18T00:47:06.337 回答
0

将您的问题分解为状态。定义在不同状态下对不同输入应该做什么。翻译成代码。

在您的情况下,您需要弄清楚输入不需要的长度何时会影响您以及如何处理它。读取三元组可以正常工作,但是对于您获得的每个字符,您需要查看是否应该提出错误或以特殊方式处理它。

尝试运行字符串"", "a", "ab","abc""abcd"通过您描述的状态,看看您是否可以以理智的方式处理它们。当这可行时,编写代码应该不是问题。

于 2012-09-18T14:43:26.780 回答
0

模拟短文件的一种简单方法是在程序中使用 echo 和管道:

echo ABC | ./program_name

这样,您可以在命令行上使用不同的字符串进行测试。echo 的输出将通过管道传输到程序的标准输入。程序中的标准输入将在字符串末尾关闭。这避免了当您直接使用键盘进行测试时导致 getchar 阻塞的 EOF 问题(终端行/字符输入法除外)。

另一个问题是 EOF 是一个 int 常量。因此,请检查您的代码是否稍后不会将 c1、c2、c3 转换为 char。没关系,但是如果将它们转换为char,则无法再与EOF进行比较。

于 2012-09-18T15:35:54.030 回答