为什么在使用scanf扫描字符串时不存储先前的输入缓冲区?

时间:2016-04-23 20:39:49

标签: c

scanf("%d",&i);
scanf("%c",&ch);

在这种情况下,换行符(即在数字后按下的回车键)停留在输入缓冲区中并向前移动到 ch
但在这种情况下:

scanf("%d",&i);
scanf("%s",s);

输入缓冲区不包含换行符,即缓冲区已清除(我不确定缓冲区是否已清除)且换行符未在字符串 s

中删除

有人可以对此有所了解吗?为什么在扫描字符串时不采用换行符?

1 个答案:

答案 0 :(得分:1)

%s%c的行为在标准中定义。

%s说明符定义为采用一系列非空白字符,这意味着将跳过初始空格(包括\n):

  

%s匹配不是空格字符的字节序列。应用程序应确保相应的参数是指向char,signed char或unsigned char数组的初始字节的指针,其大小足以接受序列和终止空字符代码,这些代码应自动添加。 (documentation

另一方面,

%c对空白没有任何特殊处理:

  

%c匹配由字段宽度指定的数字的字节序列(如果转换规范中不存在字段宽度,则为1)。