『Cプログラミングの落とし穴』(A.コーニグ, 1990)
[M1 Mac, Big Sur 11.6.8, clang 13.0.0, NO IDE]
これまで扱ってきた不完全なコードについてscanf関数の引数を%sに修正しました。
しかし挙動はおかしいままでした。実はchar cが確保するメモリ領域が足りていません。ヌル文字の分も確保する必要があります。
ストリームバッファに改行コードが残っているはずなのにループが暴走しないのは何故なのか分かりません。
#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("%s",&c);
cout << "cout c: " << c << endl;
printf("printf c: %d\n",c);
printf("printf i: %d\n",i);
}
return 0;
}
--------------------------------------------------
出力
--------------------------------------------------
iのアドレス: 0x16b0df698
iのサイズ: 4
cのアドレス:
cのサイズ: 1
for文開始直後 printf i: 0
a
cout c: a
printf c: 97
printf i: 0
for文開始直後 printf i: 1
a
cout c: a
printf c: 97
printf i: 0
for文開始直後 printf i: 1