关于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这三个字符的原因吗,所以必须加一个多余的数字来结束输入? 展开
#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这三个字符的原因吗,所以必须加一个多余的数字来结束输入? 展开
2个回答
展开全部
%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后面所有的连续的空白符全部吃掉,直到碰到非空白字符
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询