2

まず、下手な英語についてお詫び申し上げます。

次の簡単なプログラムでは、

void fx(int *a){
    for(int i=*a; i<='Z'; i++)
    printf("%c", i);
}
int main(){
    int a;
    scanf("%c", &a);
    fx(&a);
    return 0;
}

実行時に大文字を入力すると致命的なエラーが発生し、プロセスを強制終了することで解決しました。

次のコードでは問題ありません。

//except fx()
int main(){
    int a;
    scanf("%c", &a);
    return 0;
}

また

//initialize int a
void fx(int *a){
    for(int i=*a; i<='Z'; i++)
    printf("%c", i);
}
int main(){
    **int a = 0;**
    scanf("%c", &a);
    fx(&a);
    return 0;
}

文字を入力するには「char」でなければならないことはわかっています。しかし、上記の状況については理解できません。

どうしたの?

PS。私はVS2010、c ++で作業しました

4

2 に答える 2

8

この違いは

int a;
scanf("%c", &a);

この

int a = 0;
scanf("%c", &a);

それはint a;uninitialized を宣言することaです。だから何とでもなる。あなたが書くとき

scanf("%c", &a);

初期化されていないでは、入力を a に書き込むように指示されているintため、最上位ビットのみを設定しているため、最初のバイトのみが書き込まれます。これは、あなたが今述べたことを含め、いくつかの奇妙な動作につながる可能性があります。%cscanfchar

于 2012-06-04T18:03:16.803 に答える
2

初期化されていない int aを宣言し、最下位バイトを何かに設定しました。最上位バイト (16 ビット整数または 32 ビット整数) が未割り当て/初期化されていないため、結果は非常に大きな数値になる可能性があります。

関数に渡すと、これは int a表現の全範囲を使用します。次に、「'Z' になるまで」という停止条件でサイクルをセットアップしました。ちなみに、これは正しく整数に昇格されます (つまり、使用されていない最上位のバイトはすべて 0 になります)。

そのサイクルでは、 iが「Z」にロールオーバーするのにかかる時間に応じて、0 から 0xff にまたがるバイトを数兆回出力しようとする貧弱な printf を強制することになります... どうやらその printf コードのどこかで、誰かが印刷不可能な(非ASCIIだけでなく)コードが好きではありませんでした。

于 2012-06-04T18:35:07.807 に答える