【问题标题】:C : getchar() and putchar()C : getchar() 和 putchar()
【发布时间】:2020-07-08 22:58:05
【问题描述】:

所以我一直在自学 C,并且从“stdio.h”中遇到了“getchar()”和“putchar()”方法。据我了解,“getchar()”从文本流中获取最新的字符并将其存储到一个变量中,而“putchar()”则获取该变量并将其打印到终端。

所以我写了以下代码:

    #import<stdio.h>

void main () {
    printf("Enter a character and it will be repeated back to you:\n");
    int c;
    while (c != EOF) {
        c = getchar();
        printf("You entered : ");
        putchar(c);
        printf("\n");
    }
}

我希望它能够读取键盘输入并将其一次打印到屏幕上一个字符。例如,如果我输入“home”,输出将是:

您输入了:h 你输入了:o 你输入了:米 你输入了:e

但我得到了:

首页 你输入了:h 你输入了:o 你输入了:米 你输入了:e

字符被打印为即时打字,然后重复。我不太确定我在这里做错了什么,或者我是否做错了什么,只是不太了解这个概念。谁能解释这里发生了什么?

【问题讨论】:

  • 该程序表现出未定义的行为,因为c 在第一次使用时未初始化。阅读时还会将EOF 传递给putchar,这是不应该的。
  • void main() 应该是 int main(void)。如果您有一本书告诉您使用void main(),那么它的作者对C 的了解还不够多,因此无法撰写有关它的文章。 (除非它指的是一些特定的独立实现,但这不太可能。)
  • 本书由 Brian W、Kercnighan 和 Dennis M. Ritchie 撰写。目前,主函数只是“main(){}”,但我添加了 void,因为我有 C# 和返回类型之类的经验。
  • 您将从#include &lt;stdio.h&gt; 获得更多里程。把import留给python...
  • 在 K 和 R 时代,返回类型默认为 int,但是,在现代 C 中,这是一个问题,您必须明确声明:int 作为返回类型

标签: c


【解决方案1】:

你得到的输出是预期的。

除非您使用特定于操作系统的功能来更改终端设置,否则终端输入仅在您输入整行时对应用程序可用。终端驱动程序缓冲行以允许您在提交之前进行编辑,并在您输入时回显您的输入。

输入行后,对getchar() 的每次调用都会从行中检索一个字符(以及最后的换行符)。

但是,您的程序中有一个与您的问题无关的错误。在第一次分配之前,您正在测试 c。此外,c != EOF 测试正在检查上一次迭代的输入,该迭代已经尝试打印该输入,但您无法打印EOF

编写循环的更好方法是:

while ((c = getchar()) != EOF) {
    printf("You entered : ");
    putchar(c);
    printf("\n");
}

或者如果组合的作业和测试令人困惑,您可以这样做:

while (1) {
    c = getchar();
    if (c == EOF) {
        break;
    }
    puts("You entered: ");
    putchar(c);
    putchar('\n');
}

【讨论】:

  • @TomKarzes 谢谢,我只关注关于输入处理的问题。我已经更新了答案以显示如何解决这个问题。
  • 谢谢,我担心我做错了什么。我还用未分配的变量解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多