程序在执行scanf("%c", &ch)这一行时没有停止,为什么?

13

程序在执行scanf("%c", &ch)语句时没有停止,为什么会这样发生?有人可以给我解释一下吗?

#include<stdlib.h>
#include<stdio.h>

struct list {
   char val;
   struct list * next;
};

typedef struct list item;

void main()
{
    char ch;
    int num;

    printf("Enter [1] if you want to use linked list or [2] for realloc\n");  
    scanf("%d", &num);
    if(num == 2)
    {
        scanf("%c", &ch); 
        printf("%c", ch);
    }
}

2
基本上,虽然 scanf 的几乎所有其他格式说明符都会剥离前导空格,但 %c 是个例外。你必须非常小心地对待它。 - Andon M. Coleman
2个回答

21
假设你输入2作为num的值。实际输入流将是2\n(\n是换行符)。2传递给num,剩下的\n则传递给了ch。为了避免这种情况,在格式说明符中添加一个空格即可。
scanf(" %c", &ch); 

这将忽略任何空格、换行或制表符。

9
由于前一个 scanf 留下的换行符 \n 字符,当按下 Enter 键后,会导致下一个 scanf 读取到换行符而不是用户输入的内容。这就是背后的原因。在处理此问题时,需要注意清除缓存区中的换行符。
scanf("%c", &ch);   

如果前一个scanf留下了\n,那么执行下一个scanf时会读取到它。为了消除这个\n,您可以在%c说明符前加上一个空格。在%c说明符前加上一个空格可以消除任意数量的空白字符。

scanf(" %c", &ch);   
       ^ a space

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