为什么我在这个简单的代码中得到以下输出?

时间:2014-09-07 06:57:31

标签: c output

#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 ...即。垃圾。

3 个答案:

答案 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
  }