C言語関係掲示板

過去ログ

No.595.キーボードから読み込んだものをチェックするには?

[戻る] [ホームページ]
No.5665

キーボードから読み込んだものをチェックするには?
投稿者---winchan(2003/04/02 01:18:49)


C言語勉強中の初心者です。

キーボードから数字を読み込んで、それを1つずつ配列に
取込むのですが、数字以外のものが入力された場合には
「整数を入力してください」等、正しく入力する様に
エラーメッセージを表示して最初に戻りたいのですが
どうすればよいのでしょうか?
今のやり方では数字以外のものが入力された時のチェックが
なされていません。数字以外のものが入力された場合の
チェック及び再入力を促すエラーメッセージの表示方法を
教えて下さい。
簡単な質問で申し訳ありませんが、よろしくお願いいたします。

for (i = 0; i < 4; i++)
{
scanf("%1d", &bangou1[i]);
}

 


No.5666

Re:キーボードから読み込んだものをチェックするには?
投稿者---NAZCA(2003/04/02 01:46:09)


scanf関数は入力できた個数を返すのでそれを利用して
数値が入力されたかをチェックすることができます。
引数が1個の場合、うまく入力ができた場合1が帰りま
す、なので戻り値が1であれれば数値が入力されたこと
になります。
もし、scanf("%s" , str)と書いて、入力値が「abc」
であれば、1が帰り変数「str」には入力された文字列
が入ります。その応用で、scanf("%d" , &val)とする
と、%dは整数指定なのできちんとした数値が入力されれ
ば1が帰り、1が帰ったことによって判断できます。

#include <stdio.h>

int main(void)
{
long val;
char inn;
inn = scanf("%d", &val);
if (inn == 1)
{
/* 数値が入力されたときの処理 */
}
else
{
/* 誤って入力されたときの処理 */
}
return(0);
}


No.5676

Re:キーボードから読み込んだものをチェックするには?
投稿者---winchan(2003/04/02 18:40:58)


書き方悪くてすみません。
あれから、最初に書いたソースではなく下記の状態にしています。
これで入力に誤りがあった場合に「return 1;」で抜けるのですが
これで動作が終わってしまうので、終わらせずに尚且つエラーメッセージを
表示して、きちんと4桁の数字を取込みたいのです。
きちんと入力された場合の処理はここでは行いません。ここでは単に数字を取込む
処理が出来ればそれでいいので、アルファベットや記号など、
数字以外のものが入力された場合にエラーメッセージを表示させたいのです。
この場合でもやはり【char inn】のように、文字列として処理しないとできないのでしょうか?
初心者で勘違いしている所も多々あると思いますが、ご指導のほどよろしくお願いいたします。


#include <stdio.h>

int main(void)
{
int a[3][4], i;

for (i = 0; i < 4; i++)
if (scanf("%1d", a+i) != 1) return 1;

return(0);
}



No.5678

Re:キーボードから読み込んだものをチェックするには?
投稿者---あかま(2003/04/02 19:01:54)


これでどうでしょ?

#include <stdio.h>

int main(void)
{
int a[3][4], i;

for (i = 0; i < 4; i++){
if (scanf("%1d", a+i) != 1){
printf("エラー、今の桁を入力しなおしてください\n");
i--;
}
}
}


No.5681

無限ループに陥るのですが・・・
投稿者---winchan(2003/04/02 20:21:57)


色々教えていただいて有難うございます。
早速、下記のソースを実行していみたところ
エラーメッセージはちゃんと出るのですが
無限ループに陥ってしまうのです。
無限ループにならない様にする方法はありますか?
何度もすみませんが、よろしくお願いします。


#include <stdio.h>

int main(void)
{
int a[3][4], i;

for (i = 0; i < 4; i++){
if (scanf("%1d", a+i) != 1){
printf("エラー、今の桁を入力しなおしてください\n");
i--;
}
}
}



No.5682

Re:無限ループに陥るのですが・・・
投稿者---あかま(2003/04/02 23:27:58)


>無限ループに陥ってしまうのです。
>無限ループにならない様にする方法はありますか?
>何度もすみませんが、よろしくお願いします。

きちんと動作確認せずに申し訳ないです。
たしかに無限ループに陥りました(汗
原因はprintfで入力できなかった時、入力文字がキーバッファに残ったままになってしまうんですね。
知らなかったです(滝汗
↓で解決できると思います。
ただバッファのフラッシュは処理系により未定義とあるので、そのときはgets関数か何かで適当に吐き出してもいいかと思います。
#include <stdio.h>

int main(void)
{
int a[3][4], i;

for (i = 0; i < 4; i++){
if (scanf("%1d", a+i) != 1){
printf("エラー、今の桁を入力しなおしてください\n");
i--;
fflush(stdin);
}
}
}




No.5684

もう少し教えてください。
投稿者---winchan(2003/04/03 03:16:37)


無限ループの件、解消できました。
どうも有り難うございます!
もう少し教えていただきたいのですが、
今回、4桁の整数を読み込むのですが
5桁目が入った場合にエラーメッセージを
出すにはどうすればよいのでしょうか?
色々試してみたのですが、どうもうまくいかなくて。
整数以外のものが入力された時のエラーメッセージは
教えて頂いた方法でうまく表示できるようになりました。
何度も申し訳ありませんが、よろしくお願いします。

#include <stdio.h>

int main(void)
{
printf("前回の番号を4桁の整数で入力して下さい:");

for (i = 0; i < 4; i++){
 if( tousen1[i] != 1)
 if(scanf("%1d", &tousen1[i] )!=1)
 {
  printf("\a入力が間違っています。4桁の整数を入力して下さい。\n前回の番号:");
  fflush(stdin);
  i-- ;
  }
}
return(0);
}


No.5685

Re:もう少し教えてください。
投稿者---あかま(2003/04/03 04:04:20)


>5桁目が入った場合にエラーメッセージを
>出すにはどうすればよいのでしょうか?
for文で4回回しているので5桁目の入力ってしようと思っても無理でない?

間違いの無いよう、プログラムの仕様を聞いておきたいのだけど、
"1234"ていう4桁の数字を入力しようとした時に
tousen1[0] =1234;
ではなくて
tousen1[0] =1;
tousen1[1] =2;
tousen1[2] =3;
tousen1[3] =4;
でいいんだよね?


あともう一つ。すでに仕様変更しちゃってるけど前のプログラムで。
int a[3][4], i;
for (i = 0; i < 4; i++)
if (scanf("%1d", a+i) != 1)

これに1234を入力すると
a[0][0]=1;
a[1][0]=2;
a[2][0]=3;
a[3][0]=4;
になって配列の要素をオーバー(a[2][3]までしか入力できない)してるから気をつけて。

a[0][0]=1;
a[0][1]=2;
a[0][2]=3;
a[0][3]=4;
にしたい時は
if (scanf("%1d", &a[0][i]) != 1)
と書いとくのが無難。

No.5686

Re:もう少し教えてください。
投稿者---winchan(2003/04/03 09:52:51)


>for文で4回回しているので5桁目の入力ってしようと思っても無理でない?

実際には頭から4桁しか取り込みはされないんですけど
画面上では「12345」と入力できてしまうのです。
それだと誤解を招いてしまうので、「1234」としか入力できない
ようにしたいなと思って。無理でしょうか?

>間違いの無いよう、プログラムの仕様を聞いておきたいのだけど、
>"1234"ていう4桁の数字を入力しようとした時に
>tousen1[0] =1234;
>ではなくて
>tousen1[0] =1;
>tousen1[1] =2;
>tousen1[2] =3;
>tousen1[3] =4;
>でいいんだよね?

はい、これでいいです。
色々と教えてくださってどうも有り難うございます。
何冊かの本をとっかえひっかえ読んでいるのですが
中々自分の思う答が見つけられなくて。難しいですね。

何度も申し訳ございませんが、よろしくお願いします。

No.5687

Re:もう少し教えてください。
投稿者---あかま(2003/04/03 12:21:08)


>実際には頭から4桁しか取り込みはされないんですけど
>画面上では「12345」と入力できてしまうのです。
>それだと誤解を招いてしまうので、「1234」としか入力できない
>ようにしたいなと思って。無理でしょうか?
入力が何桁でもできちゃうのは仕様ですねぇ。
入力時に桁数を制限するのはできないんじゃないかな?

何桁入力しても4桁しか読み込まない旨を表示しとく。
読み込んだ数字を表示して確認させる。
というような方法をとるぐらいしか思いつきません。


No.5689

Re:もう少し教えてください。
投稿者---winchan(2003/04/03 13:23:04)


>>実際には頭から4桁しか取り込みはされないんですけど
>入力が何桁でもできちゃうのは仕様ですねぇ。
>入力時に桁数を制限するのはできないんじゃないかな?

仕様によって違うんですね。知りませんでした。
4桁しか有効でない旨を表示するようにします。
本当に色々とどうも有り難うございました。
もっと頑張って勉強します!

No.5691

Re:キーボードから読み込んだものをチェックするには?
投稿者---かずま(2003/04/03 18:18:11)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int get4dig(int *a)
{
    char b[1024], c, d[5];  int i;

    do {
        printf("  Input 4 digits: ");
        if (fgets(b, sizeof b, stdin) == NULL) return 1;
    } while (sscanf(b, " %4[0123456789] %c", d, &c) != 1 || strlen(d) != 4);
    for (i = 0; i < 4; i++)
        a[i] = d[i] - '0';
    return 0;
}

int main(void)
{
    int a[3][4], i, j;

    for (i = 0; i < 3; i++) {
        printf("a[%d]:\n", i);
        if (get4dig(a[i])) return 1;
    }
    printf("\n");
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 4; j++)
            printf("  a[%d][%d] = %d", i, j, a[i][j]);
        printf("\n");
    }
    return 0;
}


No.5692

Re:キーボードから読み込んだものをチェックするには?
投稿者---かずま(2003/04/03 19:05:02)


1 2 3 4 という入力も許すのなら、もうちょっと簡単になります。
int get4dig(int *a)
{
    char b[1024], c;

    do {
        printf("  Input 4 digits: ");
        if (fgets(b, sizeof b, stdin) == NULL) return 1;
    } while (sscanf(b, "%1d%1d%1d%1d %c", a, a+1, a+2, a+3, &c) != 4);
    return 0;
}