为什么这个程序不能打印所需的输出?

时间:2016-06-24 07:11:05

标签: c format-specifiers

我只知道此链接中的%i格式说明符

Difference between format specifiers %i and %d in printf

我尝试用这个程序实现它。

#include <stdio.h>

int main(){

    long long a,b;

    printf("Input: ");

    scanf("%i %lld",&b,&a);

    printf("Output: %i %lld",b,a);
}

%我工作正常,但%lld在变量a中存储垃圾值。

这是该程序的输出。

  

输入:033 033

     

输出:27 141733920846

     

进程返回0(0x0)执行时间:4.443秒   按任意键继续。

任何人都可以解释一下,为什么我在变量a中得到垃圾值?

2 个答案:

答案 0 :(得分:5)

scanf %i需要int *,但您传递的&blong long int *。这有不明确的行为。

您应该使用%lli

printf中出现同样的问题:使用%lli打印b,而不是%i

您还应该检查scanf的返回值,以确保成功读取了两个值。

答案 1 :(得分:1)

首先,对%i使用long long int是未定义的行为,因此请改用%lli

同样的问题也存在于printf语句中。

固定代码:

#include <stdio.h>


int main(){

    long long a,b;
    int retval;


    printf("Input: \n");

    retval = scanf("%lli %lld",&b,&a);

    printf("Output: %lli %lld",b,a);
    printf("\nRetval: %d",retval);
    return 1;
}

输入:

  

033 033

输出:

  

输入:输出:27 33 Retval:2

Live Demo

注意:请务必检查scanf的返回值。它返回扫描项目的数量,您应该根据您的期望进行测试。