【问题标题】:Reading three characters per loop iteration in C?在C中每次循环迭代读取三个字符?
【发布时间】:2012-09-10 05:44:14
【问题描述】:

这对我来说毫无意义,但希望你们中的一个人明白为什么会这样。

我有一个作业需要使用 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 是否有些奇怪?

【问题讨论】:

  • 如果只输入Abcd,你想发生什么?
  • c2 和 c3 应为零,c1 应包含 D 的值
  • 你是如何提供输入的?如果您在命令行输入文本,之后是按Ctrl+D(Linux)还是Ctrl+Z(Windows)?
  • @user1661781:c2 是 \n,c3 仍在等待输入。
  • 它是顺序循环的,所以你的工作要等到输入c3 之后才能完成。因此,如果您输入“abcd”,即 4 个字符,那么您就在 c2 = getchar(); 代码行……在您的工作再次完成之前,您还有 2 个字符要走。

标签: c input io getchar


【解决方案1】:

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

因此,要么检查 c1c2c3 中的任何一个是否是对应的 getchar 调用之后的换行符(查看输入行是否已结束),或者按 Ctrl+D (*nix, OS X) 或Ctrl+Z (Windows) 来表示文件结束 (EOF)。在 EOF 之后,getchar 总是会立即返回 EOF

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      echo ABC | ./program_name
      

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

      另一个问题是 EOF 是一个 int 常量。因此,请检查您的代码是否稍后不会将 c1、c2、c3 转换为 char。没关系,但是如果你把它们转换成char,你就不能再和EOF比较了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-05
        • 1970-01-01
        • 2017-04-28
        • 2016-07-29
        • 2015-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多