#include<stdio.h>
int main()
{
int i,l,*A;char C;
A=(int*)malloc(5*4);
for(i=0;i<5;i++)
scanf("%d",A+i);
scanf("%c",&C);
scanf("%d",&l);
printf("%d%c\n",l,C);
return 0;
}
输入:5 4 3 3 9 r 1
我希望输出为1r。但我得到的输出为21473443 84 ...即。垃圾。
答案 0 :(得分:4)
在您的示例中,%c
读取r
之前的空格,后续scanf("%d")
无法读取整数(因为它显示为r 1
)。
要验证这一点,请检查scanf()
的返回值:它是the number of items successfully matched and stored,因此最终的scanf()
将返回零。
P.S。在malloc()
(或其他任何地方)你不应该假设sizeof(int) == 4
。
答案 1 :(得分:1)
对于%c
转换说明符,scanf不会像%d
那样省略空格。你必须告诉scanf跳过空格,然后读取第一个非空白字符。这是您的固定代码。
#include<stdio.h>
#include <stdlib.h>
int main()
{
int i,l,*A;char C;
A=malloc(5*sizeof(int));
for(i=0;i<5;i++)
scanf("%d",A+i);
scanf(" %c",&C);
// ^ here
scanf("%d",&l);
printf("%d%c\n",l,C);
free(A); // remember to free what you've malloc'd
return 0;
}
由于您询问如何验证scanf的返回值,请参阅scanf的原型:
int scanf(const char * format,...);
如您所见,它返回int。手册页更多地说明了返回值:
返回值
这些函数返回输入项的数量 成功匹配和分配,可能少于提供的数量 在早期匹配失败的情况下,甚至为零。
这部分我将留给你做。我希望现在很清楚如何检查scanf的返回值。
答案 2 :(得分:0)
(1)在scanf(即%c
scanf(" %c",&C);
之前给出空格
(2)Scanf函数返回成功匹配和分配的输入项目数。
检查scanf返回值,
void main
{
int a,b,c,d;
a=scanf("%d%d%d",&b,&c,&d);
printf("a=%d\n",a);//a=3
a=scanf("%d",&b);
printf("a=%d",a);//a=1
}