C言語上級者を目指して!(その3・入力チェック)


C言語で入力チェックをしたい。
今まで、多くの場面でscanf関数を使ってました。
でも、scanf関数には弱点があります。

#inlude<stdio.h>

int main(){
  int a;
  printf("input number:");
  scanf("%d",&a);
  printf("%d\n",a);
  return 0;
}

と書きます。

すると、実際に入力された値が1000000000とかだったらどうなるでしょう?
int型の保持できる範囲を超えるので、aには正しい値が入りません。

まだ数字ならまだしも、数字じゃなかったらどうなるでしょう?

input number: wrong
0

数字じゃないので、値が入れられてないですね。
ホントは、もっとぐちゃぐちゃな問題を起こすかと思ったけど、そうでもなかった(笑)
gccだと、それなりに処理してくれるんだろうか?

まあ、ちゃんとした入力チェックをするには、fgets関数を使うのがベターだそうです。

#include<stdio.h>

int main() {
  char str[100];
  printf("input number:");
  fgets(str, sizeof(str), stdin);
  /* ここで入力チェック */
  printf("%d",str);
  return 0;
}

gets関数だと、用意した配列のサイズまで入力を受け付けることになります。
そのとき、入力は文字列として受け付けるので、例えば数字かどうかをコメントのところでチェックする必要があります。
例えば、3桁以内の整数かどうかをチェックするためには、以下のようなチェックをします。

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

int main() {
  int i = 0;
  int flag = 1;
  int num = 0;
  char *p;
  char str[100];

  printf("input number:");
  fgets(str, sizeof(str), stdin);

  p = str;
  while ((*p != '\n') && flag) {
    if (*p >= '0' && *p <='9') {
      p++;
      i++;
    } else {
      flag = 0;
    }
  }

  if (flag && i<= 3) {
    printf("input number is %d ( %d digt)\n", atoi(str), i);
  } else {
    printf("input is not a good integer\n");
  }

  return 0;
}

とりあえず、fgetsを使う癖をつけたほうがいいみたいですよ。
あとは、入力チェックのアルゴリズムを地味に作るしかない。
とりあえず、数字とかアルファベットとかの条件は、上のサンプルプログラムのように、

*p >= '0' && *p <= '9'
(*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z')

とかいった感じで作れると思います。

入力チェックのアルゴリズムは、一度作ってみるといいかもしれないですね。
パターンは限られてる気もするので。


シェアする

  • このエントリーをはてなブックマークに追加

フォローする