3

为什么这不能按预期工作?

int main()
{
    unsigned char louise, peter;

    printf("Age of Louise: ");
    scanf("%u", &louise);

    printf("Age of Peter: ");
    scanf("%u", &peter);

    printf("Louise: %u\n", louise);
    printf("Peter: %u\n", peter);

    return 0;
}

输出:

Age of Louise: 12
Age of Peter: 13
Louise: 0
Peter: 13

但是,如果我交换变量声明,它会起作用:

unsigned char peter, louise;

输出:

Age of Louise: 12
Age of Peter: 13
Louise: 12
Peter: 13

我还注意到使用intorunsigned int无需交换变量即可工作,但char不需要。

我已经尝试printf("%u", louise);在 for louise 之后放置scanf(),并且该值已正确保存。如果我注释掉第二个scanf()它也可以正常工作......

“问题”显示在 Windows (DevCpp) 和 Linux (kwrite + make) 上。这是编译器的错误,还是我的?

4

2 回答 2

4

因为%u读取和存储一个unsigned int,它很可能比unsigned char你拥有的单个更大。这会导致相邻的值被覆盖。

无法读取整数字符串(例如“42”)并将其存储在char. 您必须通过int. 例子:

int tmp;
char my_char;

if(scanf("Enter a number: %d", &tmp) == 1)
{
  my_char = (unsigned char) tmp;
}
于 2010-02-03T13:48:13.193 回答
1

那是你的错误,你的变量unsigned char是 1 字节的类型,但是,你输入 12 是 4 字节(无符号整数),导致溢出(由编译器/运行时定义的实现),这将解释它覆盖内存中的下一个变量。您使用的%u说明符printf是一个unsigned int,对于一个unsigned char变量,它不正确并且不匹配。这解释了,正如您自己发现的那样,使用unsigned intorint有效,因为有足够的空间来保存输入值。

希望这会有所帮助,最好的问候,汤姆。

于 2010-02-03T13:59:00.923 回答