【问题标题】:Why is getchar() reading '\n' after a printf statement?为什么 getchar() 在 printf 语句后读取 '\n'?
【发布时间】:2013-02-08 03:29:34
【问题描述】:


我提示用户输入数组的长度,用这个输入初始化一个 char[] 数组,然后提示用户输入一条消息以输入 char[] 数组。

我正在使用getchar() 阅读用户消息的第一个字符。

但是,getchar() 在读取任何用户输入之前正在读取换行符 '\n'。似乎从前面提示用户的printf 语句中得到'\n'...


以下是相关代码:

#include <stdio.h>

int main(void) {

    int len = 0,
        originalLen = 0;

    printf("\n\nWhat is the length of the array? ");
    scanf("%d", &originalLen);
    char str[originalLen]; // intitializing the array

    printf("Enter a message to enter into the array: ");
    char target = getchar();
    str[len] = target;

    // why is getchar() reading '\n'?
    if (target == '\n') {
        printf("\n...what happened?\n");
    }
    return 0;
} // end of main


【问题讨论】:

    标签: c newline printf getchar


    【解决方案1】:

    这是因为之前的scanf 没有读取数字后面的换行符。

    这可以通过两种方式解决:

    1. 使用例如getchar阅读它
    2. scanf 格式后添加一个空格(例如scanf("%d ", ...)

    【讨论】:

    • 感谢@Joachim,看来您必须为scanf 使用额外的空间技巧...有没有更好的选择,或者这是否被专业人士接受?
    • @IanCampbell 我不会称其为“hack”,它只是告诉scanf 读取(并丢弃)空格。至于“专业接受”,我自己用过很多,在很多其他代码中也看到过,所以并不少见。
    【解决方案2】:

    您可以在循环中使用getchar 在读取下一个字符之前清除标准输入。

    while((target = getchar()) != '\n' && target != EOF)
    

    【讨论】:

      【解决方案3】:

      当你输入数字并按下ENTER键时,一个数字和一个字符被放入输入缓冲区,它们分别是:

      • 输入的数字和
      • 换行符(\n)。

      数字被scanf 消耗,但换行符保留在输入缓冲区中,由getchar() 读取。

      您需要在调用getchar() 之前使用\n,方法是:

      scanf("%d ", &originalLen);
               ^^^
      

      这告诉scanf 读取数字和一个附加字符,即\n

      【讨论】:

      • 啊,谢谢@Alok,这是有道理的——它按下了添加'\n' 字符的ENTER 键。 scanf 会因为这个原因而皱眉吗?
      • @IanCampbell:是的,为此以及更多。如:类型安全、输入验证等。在读取字符和字符串时应避免使用它,但可以将其用于简单的数字输入。
      • 谢谢@Alok,很有趣...那么对于字符和字符串,有什么比scanf 更好的选择?
      • @IanCampbell: fgets always!
      猜你喜欢
      • 2020-11-25
      • 2017-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多