为什么在printf语句之后使用getchar()会读取'\n'?

3
我正在提示用户输入数组的长度,用此输入初始化一个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


3个回答

4

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

有两种解决方法:

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

谢谢@Joachim,所以看起来您必须使用“scanf”的额外空格技巧...是否有更好的替代方法,或者这是职业上被接受的做法? - Ian Campbell
2
@IanCampbell 我不会称它为“hack”,它只是告诉 scanf 读取(并丢弃)空格。至于“专业接受”,我自己经常使用它,并在许多其他代码中看到它,所以它并不罕见。 - Some programmer dude

3

在循环中使用getchar可以清空stdin,然后再读取下一个字符。

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

2
当您输入数字并按下ENTER键时,一个数字和一个字符被放置在输入缓冲区中,它们分别是:
- 输入的数字 - 换行符(\n)
数字被scanf读取,但换行符仍然留在输入缓冲区中,可以通过getchar()函数读取。
在调用getchar()之前,需要使用以下方法消耗掉换行符:
scanf("%d ", &originalLen);
         ^^^

这段代码告诉scanf函数读取数字和一个额外的字符,该字符是\n

啊,谢谢@Alok,这很有道理——按下ENTER键会添加'\n'字符。因此,scanf被认为是不好的吗? - Ian Campbell
1
@IanCampbell:是的,对于这个问题以及许多其他问题都是如此。例如:类型安全、输入验证等等。在读取字符和字符串时应该避免使用它,但对于简单的数字输入可以使用它。 - Alok Save
谢谢@Alok,很有趣...那么除了scanf,有更好的字符和字符串输入替代方案吗? - Ian Campbell
1
@IanCampbell: fgets永远没错! - Alok Save

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接