scanfは使ってはダメだとよく聞きます。
オーバーフローは
char str[10];
scanf("%9s",str);
のようにすれば防げるのでしょうけど、
たまったバッファはどうやってクリアしたらいいのですか?
fflushは未定義になるので使ってはダメなのですか?
整数を入力させようとした時、
int a;
scanf("%d",&a);
printf("%d\n",a);
scanf("%d",&a);
printf("%d\n",a);
に対して
120s1
みたいに入力すると
120
120
と表示されてしまいます。
キーボードから正しく入力させるにはどうしたらいいのでしょうか?
getcharを使うのでしょうか?
環境は一応問わないものとします。
scanfは使ってはだめ?
Re:scanfは使ってはだめ?
これでどうでしょうか。
エラー処理も含めて正常にint型が取得できると思います。
エラー処理も含めて正常にint型が取得できると思います。
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <limits.h> int myGetInt( int *x ){ int i=0, error_flag=0, ch; char str[11]; memset( str, 0, (size_t)11 ); /* ゼロクリア */ while( ( ch = getchar() ) != '\n' ){ /* 改行が行われるまでループ */ if ( isdigit( ch ) == 0 ){ /* 10 進数で表せなければ */ error_flag=1; } if ( i < 10 && ch != -1 ){ str[ i ] = ch; } i++; } *x = strtol( str, NULL, 10 ); /* str を10進数整数に変換 */ if ( error_flag == 0 && errno != ERANGE && *x != LONG_MIN && *x != LONG_MAX ){ /* エラーフラグがオフで、strtolの結果が正常で、変換可能数値内なら */ return 0; } else { return -1; } } int main(){ int a; if ( myGetInt( &a ) == 0 ){ printf( "%d\n", a ); } else { printf( "エラー\n" ); } return 0; }