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

intorを使用unsigned intすると、変数を交換しなくても機能することにも気付きましたが、そうでcharはありません。

for louiseprintf("%u", louise);の直後に入れてみましたが、値は正しく保存されています。scanf()そして、2番目をコメントアウトすると、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 バイト (符号なし int) であり、オーバーフロー (コンパイラ/ランタイムによって定義された実装) を引き起こし、上書きを説明します。メモリ内の次の変数。変数に, である%u指定子を使用しましたが、これは正しくなく、一致しません。あなた自身が発見したように、入力時に値を保持するのに十分な余地があったため、 orを使用するとうまくいくことを説明しています。printfunsigned intunsigned charunsigned intint

これがお役に立てば幸いです。よろしくお願いします、トム。

于 2010-02-03T13:59:00.923 に答える