【问题标题】:Different outputs with format specifiers in CC中具有格式说明符的不同输出
【发布时间】:2012-06-29 18:53:12
【问题描述】:
int x;
scanf("%d",&x);
printf("%d",x);

Input: . (just a period)
Output: 4096

这里为什么输出4096。这就是我的想法:所以一个句点的 ASCII 值是 46。在输入时,它读入 x 作为 46 的位模式?而当它打印的时候,是不是在x的内存位置打印出四个字节,所以只有第一个字节填充了46对应的位模式,其余的都是组成4096的随机东西?但这是不正确的,因为看看我这样做时会发生什么--

int x;
scanf("%d",&x);
printf("%c",x);

Input: . (period)
Output: (nothing)

Input: 46
Output: . (period)

当我这样做时,更令人困惑的是:

int x;
scanf("%c",&x);
printf("%d",x);

Input: . (period)
Output: 4142

Input: 46
Output: 4148

Input: 47
Output: 4148

【问题讨论】:

  • 如果将x 初始化为某个值,和/或检查scanf 的返回值以查看它成功分配了多少参数,会发生什么情况?
  • @ordinary - 你想打印什么?你认为它为什么会打印出来?
  • 格式字符串必须与x的类型匹配,否则结果未定义。如果您不检查 scanf 的返回值,那么您现在不会检查它是否实际读取任何内容。

标签: c++ c printf scanf


【解决方案1】:

你需要检查scanf的返回值(它是成功读取值的计数):

int x;

if (scanf("%d",&x) == 1) {
    printf("%d", x);
} else {
    printf("Invalid input.");
}

如果解析失败,则x的值没有定义。

一旦scanf 失败,进一步的调用也会失败,因为无效的输入不会从流中删除。因此,使用scanf 不是一个好主意。

【讨论】:

  • 没错。他可以通过删除 scanf 调用来测试它,它可能会打印相同的数字。
  • "因此使用 scanf 不是一个好主意。在 C++ 中最好使用输入流:" -- 我不遵循你的逻辑.输入流也有同样的问题。您需要检查流的状态以检查值是否被成功读取,并且一旦输入到流失败,进一步的调用也会失败。
  • @BenjaminLindley:抱歉,该部分现已删除。
猜你喜欢
  • 2016-04-04
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
  • 2013-02-13
  • 1970-01-01
相关资源
最近更新 更多