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は使ってはだめ?
-
Dixq (管理人)
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;
}