【问题标题】:Why this program does not print the desired output?为什么这个程序不打印所需的输出?
【发布时间】:2016-06-24 07:11:05
【问题描述】:

我只知道这个链接的 %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);
}

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

这是这个程序的输出。

输入:033 033

输出:27 141733920846

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

谁能解释一下,为什么我在变量 a 中得到垃圾值?

【问题讨论】:

标签: c format-specifiers


【解决方案1】:

scanf %i 采用 int *,但您传递的是 &amp;b,它是 long long int *。这具有未定义的行为。

你应该使用%lli

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

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

【讨论】:

  • 是的,我也忘了在 printf 中修复它。我用固定代码和现场演示更新了我的答案。
【解决方案2】:

首先,将%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 的返回值。它返回扫描项目的数量,您应该根据自己的期望对其进行测试。

【讨论】:

  • 我很确定%d 应该将"033" 读作33,就像atoi("033")
  • @melpomene 你能提供这个来源吗?我很确定它只是不是一个有效的输入。
  • port70.net/~nsz/c/c99/n1256.html#7.19.6.2p12%d 的作用类似于strtol(..., 10)port70.net/~nsz/c/c99/n1256.html#7.20.1.4 表示接受小于基数的数字(即 0 .. 9)。它不禁止前导零。
  • @melpomene 我站在那里纠正。有趣的是,仅将其更改为 %lli 不会使垃圾值消失。目前正在对此进行进一步调查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 2011-04-07
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
相关资源
最近更新 更多