[C/C++] Cプログラミングの落とし穴 4.4 実引数 P68 scanf文法ミス abcを入力 ストリームバッファ

『Cプログラミングの落とし穴』(A.コーニグ, 1990)
[M1 Mac, Big Sur 11.6.8, clang 13.0.0, NO IDE]

不完全なプログラムのscanfにabcを入力してみました。

ストリームバッファに改行コードが残っているためにループが止まらなくなり、i=5に達して終了しました。

ストリームバッファのデータは行方不明です。おそらく%dと一致しないデータ型を入力したため、undefinedな挙動になったものと思われます。

#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++){
        printf("for文開始直後 printf i: %d\n",i);
        // rewind(stdin); // ストリームバッファをクリア
        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のアドレス: 0x16eeeb698
iのサイズ: 4
cのアドレス: 
cのサイズ: 1
for文開始直後 printf i: 0
abc
cout c: 
printf c: 0
printf i: 0
for文開始直後 printf i: 1
cout c: 
printf c: 0
printf i: 1
for文開始直後 printf i: 2
cout c: 
printf c: 0
printf i: 2
for文開始直後 printf i: 3
cout c: 
printf c: 0
printf i: 3
for文開始直後 printf i: 4
cout c: 
printf c: 0
printf i: 4