【问题标题】:different answers of scanf of a char with %d and %c带有 %d 和 %c 的字符的 scanf 的不同答案
【发布时间】:2015-09-15 18:40:32
【问题描述】:

这是一个用于交换字节的半字节的程序,非常适合字节,但我遇到了一个问题。

代码:

#include<stdio.h>  

void main()
{
    unsigned char a = 0;
    scanf("%d", &a);    
    a = ((a << 4) | (a >> 4)); 
    printf("the value of a is %d\n\r", a); 
} 

您可以在scanf 声明中看到我收到的是%d,而不是收到%cchar。上面的代码完美运行。但是如果我用%c 替换%d,我会得到一个不同的不想要的答案

为什么?

【问题讨论】:

  • 因为使用错误的格式说明符会导致未定义的行为。
  • 使用scanf("%d", &amp;a),您正在将sizeof(int) 字节复制到变量a 的内存地址中。但是由于sizeof(a) == 1 &lt; sizeof(int),此操作会产生内存覆盖,此时您的程序的行为是未定义的(即,任何事情都可能发生)。

标签: c char scanf unsigned-char format-specifiers


【解决方案1】:

scanfunsigned char 的正确说明符是 %hhu,而不是 %d

所以scanf("%d", &amp;a); 应该是scanf("%hhu", &amp;a);

您还应该使用int main(void) 而不是void main() 并删除printf 中的\r,因为\n 是每个系统上的新行。

【讨论】:

    【解决方案2】:

    你的情况

     scanf("%d", &a)
    

    错了。 %d 需要一个指向 int 的指针,而不是指向 unsigned char 的指针。它将调用undefined behaviour

    正确的做法是

     scanf("%c", &a);
    

    scanf("%hhu", &a);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      相关资源
      最近更新 更多