[C/C++] Cプログラミングの落とし穴 4.4 実引数 P68 scanf文法ミス 10000入力

フォーマット指定子を間違えた場合にプログラムがどういった挙動を示すのか検証しました。

scanf関数で%sと入力すべきところを%dとした場合、データ型がcharからintに変わるためデータサイズが増えてしまい、ややこしいことになります。

とりあえず図にまとめてみました。新・明解C言語に出てきそうな見た目です。

実はchar cの格納領域を1バイト確保するのは間違いで、末尾のヌル文字を考慮した2バイト確保が正解になります。本来はchar c[2]と書くべきですが、そのままにしています。

今回は10000を入力した場合を扱いましたが、100や1000を入れるとまた違った趣きの出力になります。気が向けば次回以降記事にします。

#include <cppstd.h>

int main() {
    int i;
    char c;

    cout << "iのアドレス: " << &i << endl;
    cout << "iのサイズ: " << to_string(sizeof i) << endl;

    cout << "cのアドレス: " << &c << endl;
    cout << "cのサイズ: " << to_string(sizeof c) << endl;

    for (i=0;i<5;i++){
        scanf("%d",&c);
        // 正しくは
        // scanf("%s",&c);

        cout << "cout c: " << c << endl;
        printf("printf c: %d\n",c);

        printf("printf i: %d\n",i);
       
    }
    return 0;
}
--------------------------------------------------
出力
--------------------------------------------------
iのアドレス: 0x16f633698
iのサイズ: 4
cのアドレス: 
cのサイズ: 1
10000
cout c: 
printf c: 16
printf i: 39