关于C语言scanf函数的一个问题

#include<stdio.h>#include<stdlib.h>intmain(){intn,i,j,t;scanf_s("%d",&n);int*a=(int*)... #include<stdio.h>
#include<stdlib.h>
int main()
{
int n, i, j, t;
scanf_s("%d", &n);
int *a = (int*)malloc(n * sizeof(int));
if (a == NULL)
{
return 0;
}
for (i = 0; i < n; i++)
scanf_s("%d ", &a[i]);

for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - i - 1; j++)
if (a[j]>a[j + 1])
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
for (i = 0; i < n - 1; i++)
printf("%d,", a[i]);
printf("%d", a[n - 1]);
return 0;
}
注意看第二个scanf哪里,%d后面有个空格,这样的话我输入的时候必须多输入一个数才能继续下一步。我想问一下,既然scanf是从缓冲区读入一个符合格式的数据,那为什么每输一个数加一个空格在后面,像3 1 5 这样,或者每个数后加两个空格,像3 1 5 再回车不可以,而是必须在输入一个数呢?网上有很多关于scanf函数的原理,我感觉有点懵。求大神指教。
是因为scanf函数会忽略空格,回车,tab这三个字符的原因吗,所以必须加一个多余的数字来结束输入?
展开
 我来答
庄政警
2017-11-26 · TA获得超过9916个赞
知道大有可为答主
回答量:1113
采纳率:94%
帮助的人:857万
展开全部

%d后面的空格是用来匹配所有的连续空白字符的(空白字符包括空格 \t \n)直到碰到不是空白的字符。

这个用法主要是为了匹配输入时的空白符,举个例子:

int a;
char c;
scanf("%d",&a);
scanf("%c",&c);

上面这个输入代码里,如果是分两次输入(用空白分割),那么c是没有机会输入的,尤其是从文件读取的时候,会有很多的空白符,c会读取到缓冲区的空白,一般解决这个问题是再用一句gtechar(), ,但如果有很多空白就比较麻烦(文件里这种情况很多),如果在%d后面加个空格,就可以吧剩下所有的空白符给吸收掉:

int a;
char c;
scanf("%d ",&a); //这样可以把空白吸收掉
scanf("%c",&c);

在你这个代码里,输入全是%d格式,那这个空格就没必要了,不如去掉

追问
呃呃。。什么是匹配空白字符??这个我不知道,所以不太懂你的意思。所以没采纳你的答案,原谅我的才疏学浅。。。我再去补补课
追答
就是说那个空格可以把%d后面所有的连续的空白符全部吃掉,直到碰到非空白字符
White_MouseYBZ
2017-11-26 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6328万
展开全部
其实很简单:按scanf接收整数的规则,在%d加一个空格,那么输入时接收一个数字之后就要等待你输入一个空格;但,%d的规则却是跳过空格、回车、制表符来寻找数字——先是让你输入空格,可是一看是空格就等待其后的数字,这就一直停留在scanf函数上了,只有再输入一个数字或其他字符才能往下走。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式