scanfは使ってはだめ?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
初心者

scanfは使ってはだめ?

#1

投稿記事 by 初心者 » 16年前

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を使うのでしょうか?

環境は一応問わないものとします。

Dixq (管理人)

Re:scanfは使ってはだめ?

#2

投稿記事 by Dixq (管理人) » 16年前

これでどうでしょうか。
エラー処理も含めて正常に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;

}

閉鎖

“C言語何でも質問掲示板” へ戻る