No.4ベストアンサー
- 回答日時:
★最初に『数字文字判定』は『isdigit』があります。
・この関数<ctype.h>を利用すれば数字文字の判定が可能です。
あと『scanf』を使うのならば『%s』で文字列で受け取って、その文字列に数字文字が
含まれない場合は再入力を促す仕組みにすればいいでしょう。
・他にも『getche()』という1文字入力されると直ぐに文字を返す関数もあります。
関連関数として『getch()』、『getc()』、『getchar()』などありますが、後ろの2つは
バッファリング機能により、リターンキーが押されないと制御を戻します。
『getche()』、『getch()』関数は1文字入力されると直ぐに読み取った文字を返します。
下にサンプルを3つ載せます。どれでもどうぞ。
サンプル1:
char buff[ 256 ];
int flag = 1;
int i;
while ( flag ){
printf( "value:" );
scanf( " %s", &buff ); ←文字列を取得
for ( i = 0 ; buff[i] != '\0' ; i++ ){
if ( buff[i] == '\n' ){
flag = 0;
break;
}
if ( !isdigit(buff[i]) ){
flag = 0;
break;
}
}
}
サンプル2:
上記のサンプル1の『scanf』の部分を『fgets(buff,sizeof(buff),stdin);』の1行に置き換える。
あとは同じです。
サンプル3:
#include <conio.h> ←忘れずに!
char buff[ 256 ];
int i, ch;
do {
printf( "\nvalue:" );
for ( i = 0 ; isdigit(ch = getche()) ; i++ ){
buff[ i ] = (char)ch;
}
buff[ i ] = '\0';
} while ( (ch != '\r') && (ch != '\n') );
最後に:
・サンプル3は1文字押されるごとに『buff』に文字を格納していきます。
そして、リターンキーや数字キー以外が押されると『for』文を抜けます。
さらに、『do-while』文の判定で抜け出た文字コードが『\r』か『\n』以外ならば
つまり英字や記号ならば『do-while』文を繰り返します。→これにより再入力となります。
・以上。おわり。→<ctype.h>や<conio.h>をインクルードして下さい。
関連質問:
・http://oshiete1.goo.ne.jp/kotaeru.php3?q=2006690→『<conio.h>getche() → <curse.h>getc() = segmentation fault』
参考URL:http://www9.plala.or.jp/sgwr-t/c/sec05.html,http …
No.6
- 回答日時:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
char inbuf[ 32 ];
int n;
char *p;
int flag = 0;
do{
printf( "Value: " );
if( fgets( inbuf, sizeof( inbuf ), stdin ) != NULL ){
/*
* '\n'が付加さるので'\0'に置き換える
*/
p = strchr( inbuf, '\n' );
if( p != NULL ){
*p = '\0';
}
/*
* 10進表記のみ受付けると仮定して、'0'~'9'以外の文字なら
* *pは不正な文字を指す。全てOKなら*pは'\0'を指す。
* もし、16進表記にしたいのなら、第3パラメータを16にする。
*/
n = strtol( inbuf, ( char**)&p, 10 );
if( *p == '\0' ){
flag = 1;
}
}
} while( flag == 0 );
printf( "n = %d\n", n );
}
No.5
- 回答日時:
エラー入力時の処理を考えると、scanfではなく「fgets(buff,sizeof(buff),stdin)」
で入力した後で sscanf で値取得&書式チェックをするのが良いかと思います。
int main(void)
{
int num;
char buff[256], dummy[2];
while (1) {
printf("Input Value: ");
if (fgets(buff, sizeof(buff), stdin) == NULL)
return 0;
// 正常(整数1個のみ)入力時はループを抜ける
if (sscanf(buff, "%d%1s", &num, dummy) == 1)
break;
printf("Format error. ");
}
printf("Input Value = %d\n", num);
return 0;
}
sscanf の戻り値が「正常に取得されたデータ数」になることを利用しています。
最初が数値でない文字列「ABC12」などを渡した場合には戻り値がEOFになり、
正しい数値「10」などの場合には戻り値が1になり、数値の後に他の文字が続く
「10XY」などの場合は1文字目「X」がdummyに格納されて戻り値が2になることを
利用しています。
No.3
- 回答日時:
#include <stdio.h>
int main(void)
{
int num, flag = 1;
do{
if(!flag) while(getchar() != '\n') ;
printf("Value:");
flag = scanf("%d", &num);
}while(!flag);
printf("%d", num);
return 0;
}
No.2
- 回答日時:
入力されるデータによります。
この質問だけでは条件が足りないと思うので入力形式を確認してください。
質問では入力データを「int n」で受けようとしていますが、「int」は4バイトです。
この4バイトを
1.文字列(半角1文字)の場合、「"1"」なら「0x0100」('1'+null)
2.文字(半角1文字)の場合、「'1'」なら「0x01」頭の2バイトだけで済んでしまう。
3.数字データの場合、数字の「1」なら「0x0001」)
です。
コンピュータの世界では、文字や文字列は全て数字に置き換えることが可能なので、
例えば4バイトで受けた場合の文字列の「"1"」(0x0100)と数値の「256」(16進で0x0100)は同じ値になってしまいます。
従って質問の条件だけでは判定できません。
しかし、入力されるバイト数や形式が限定されていれば判断要素が増えるので判断は可能になるかもしれません。
ご理解いただけたでしょうか?
No.1
- 回答日時:
参考書が悪いようです。
・printfのあとfflushが無い
・scanfで入力している
他の参考書を探しましょう。
int n;
int flag=0;
char buf[100];
do {
fprintf(stderr,"value:");
if(!fgets(buf,100,stdin)) {
fprintf(stderr,"EOFが入力された\n");
exit(1);
}
if(sscanf(buf,"%d",&n)==1) flag=1;
} while(flag==0);
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
数字以外が入力されたらエラー...
-
プログラミング初心者です。 Py...
-
Userformの入力順序をタブオー...
-
Eclipseコンソール表示を、リセ...
-
getchar()について 教えてくだ...
-
cout関数を使っているのですが...
-
"scanf"でエンターで改行させな...
-
scanf("%s", buf);でスペースを...
-
*をユーザーが入力した数字の数...
-
入力値が1以下、かつ数字以外の...
-
C言語scanf_sで何故か2回入力に...
-
正負を反転させて出力するプロ...
-
Cプログラム
-
C言語でgetchar();が上手く使え...
-
プログラミングC言語について
-
batプログラム上で文字列を入力...
-
入力する数字のサイズ制限について
-
C言語の非標準コンソール関数ge...
-
関数の値(scanf)
-
Excel VBAで、Application.Inpu...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
正負を反転させて出力するプロ...
-
プログラミング初心者です。 Py...
-
数字以外が入力されたらエラー...
-
Eclipseコンソール表示を、リセ...
-
Excel VBAで、Application.Inpu...
-
*をユーザーが入力した数字の数...
-
java初心者です。入力されたの...
-
Linuxで入力待ちなしkeyread関...
-
batプログラム上で文字列を入力...
-
WindowsでEOF
-
Userformの入力順序をタブオー...
-
コマンドプロンプトからのEOFの...
-
EDITコントロールで入力できる...
-
VisualStudio2019のコードアナ...
-
電卓の小数点
-
Eclipseでコマンドラインを入力...
-
小数か整数かを判定する方法
-
cout関数を使っているのですが...
-
UWSCで変数をキー入力
-
ワードで文字を入力する時の変...
おすすめ情報