【问题标题】:Why does getchar() return more than one character?为什么 getchar() 返回多个字符?
【发布时间】:2021-10-31 08:09:30
【问题描述】:

在使用 getchar 尝试不同的事情时,我发现它通常只保护变量中的字符。不知何故,当我使用 while 循环时,行为会发生变化,如果输入不止一个,它会返回更多字符。

这是我的“正常”行为示例代码。 putchar() 只返回一个字符甚至更多被放入:

#include <stdio.h>

main() {
    char c;

    printf("Type a character in here: ");
    c = getchar();
    printf("You just typed : ");
    putchar(c);
    
}

当我想在 while 循环中使用它时,putchar() 函数会返回多个字符(如果放入更多字符):

这是第二部分:

#include <stdio.h>

void print_input();

main() {
    char c;

    printf("Type a character in here: ");
    c = getchar();
    printf("You just typed : ");
    putchar(c);

    print_input();  
}


void print_input() {
    char ch = 'x';
    while (ch != '#') {
        ch = getchar();
        putchar(ch);
    }
    return;
}

补充问题: 在调试器中运行它时,行为与我在运行时尝试时有所不同。为什么会这样?

【问题讨论】:

  • 请给出准确的输入、预期结果和实际结果。 getchar 肯定不会返回超过一个字符。所以你需要澄清你看到的确切行为。
  • 简单地说,getchar() 每次被调用时只返回一个字符,否则返回不是字符的值EOF。如果您认为它以某种方式一次返回多个字符,那么您就是在误解您的观察结果。但在您解释您实际观察到的情况之前,我们将无法帮助您消除这种误解。
  • getchar() 将在您按下回车后从您的行缓冲区一次返回一个字符。您的程序将循环并getchar() 直到行缓冲区为空,然后等待新的输入。这是你观察和误解的吗?
  • 事实上,伙计们,在逐步测试它并在 getchar 和 putchar 之间打印空行之后,循环正在迭代抛出行缓冲区。
  • @Nizde 嗯,它不符合你的期望。

标签: c getchar


【解决方案1】:

当您输入多个字符并按回车键时,程序将看到整个输入(因为它是行缓冲的)。所以多次调用getchar 将返回后续字符并将它们从流中删除:

试着玩这个:

char c;
char d;

printf("Type chars in here: ");
c = getchar();
d = getchar();

printf("C: %c \n", c);
printf("D: %c", d);

这与以下内容重复: How is the "getchar()" function able to take multiple characters as input?

你可以在那里阅读更多内容。

【讨论】:

  • getchar() 返回一个整数。您不能使用 char 变量来保存其值。
  • @Suciu Eus:我明白你的意思,我怀疑这是我一开始不明白的。看来我必须花一些时间来了解标准输入库以及流的工作原理。谢谢您的回答! :)
  • @LeeDanielCrocker: 将getcharint返回值转换为char是没有问题的,前提是该值不是EOF。在处理用户输入时,假设值不是EOF 是相当安全的。 (当然,一个健壮的应用程序不应该假设它正在处理实际的用户输入,还应该考虑到用户输入EOF 的可能性)。
  • @LeeDanielCrocke 除非它是 EOF,否则 getchar() 返回一个转换为 int 的无符号字符。但这不是示例的重点
猜你喜欢
  • 1970-01-01
  • 2020-06-05
  • 2010-10-04
  • 2011-09-18
  • 2017-07-02
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多