【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.19838

入力値チェックについて
投稿者---mic(2005/02/11 03:01:34)


はじめまして。C初心者のmicです。
入力された数値が1〜100以外ならば「エラー」(アルファベッドや記号もエラーにする)と表示し,もう一度入力を促すにはどうすれば良いのでしょうか?
isdigitを使わなければいけないのはわかるのですが,使っているテキストに具体例がなくて使い方がイマイチわかりません。
isdigit は1ケタずつチェックしなければいけないのでしょうか?それとも数値が複数ケタでも一気にチェックできるのでしょうか?
初歩的な質問ですみませんが,つまずいてしまって。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:入力値チェックについて 19840 Craft 2005/02/11 03:40:56
<子記事> Re:入力値チェックについて 19843 南野骨茶 2005/02/11 08:01:20
<子記事> ありがとうございます 19844 mic 2005/02/11 11:22:10
<子記事> 何度もありがとうございました。 19856 mic 2005/02/11 22:23:24


No.19840

Re:入力値チェックについて
投稿者---Craft(2005/02/11 03:40:56)


>はじめまして。C初心者のmicです。
>入力された数値が1〜100以外ならば「エラー」(アルファベッドや記号もエラーにする)と表示し,もう一度入力を促すにはどうすれば良いのでしょうか?

エラーなら再入力させる、という仕掛けをつくるのであれば、ループ系の命令(while,for)などを使って、エラーでなくなるまで継続する、というやり方でいいと思います。

>isdigitを使わなければいけないのはわかるのですが,使っているテキストに具体例がなくて使い方がイマイチわかりません。

isdigitは、引数が数字なら0、それ以外なら0以外を返す関数ですが、1文字ずつしか判定できません。

過去ログ↓のRAPTさんのサンプルソースが参考になるでしょうか?
http://f4.aaa.livedoor.jp/~pointc/log1019.html


この投稿にコメントする

削除パスワード

No.19841

Re:入力値チェックについて
投稿者---BB(2005/02/11 03:54:07)


>isdigitは、引数が数字なら0、それ以外なら0以外を返す関数ですが、1文字ずつしか判定できません。
多分うっかりでしょうけど、
引数が10進数字であれば、0以外。そうでなければ0を返す。
ですね。


この投稿にコメントする

削除パスワード

No.19842

Re:入力値チェックについて
投稿者---Craft(2005/02/11 04:08:52)


>>isdigitは、引数が数字なら0、それ以外なら0以外を返す関数ですが、1文字ずつしか判定できません。
>多分うっかりでしょうけど、
>引数が10進数字であれば、0以外。そうでなければ0を返す。
>ですね。

おっと、これは失礼しました。
そのとおりです。


この投稿にコメントする

削除パスワード

No.19843

Re:入力値チェックについて
投稿者---南野骨茶(2005/02/11 08:01:20)


>入力された数値が1〜100以外ならば「エラー」(アルファベッドや記号もエラーにする)と表示し,もう一度入力を促すにはどうすれば良いのでしょうか?

1)入力文字列をisdigit()で1文字ずつチェックし、数字以外を含んでいたらエラー
2)前項でエラーとならず、数字だけからなるはずの文字列をatoi()で数値に変換
3)その数値が1〜100以外ならばエラー


この投稿にコメントする

削除パスワード

No.19844

ありがとうございます
投稿者---mic(2005/02/11 11:22:10)


ありがとうございました。
みなさんのアドバイスをもとにもう一度tryしてみようと思います。


この投稿にコメントする

削除パスワード

No.19849

つくってみましたが・・・
投稿者---mic(2005/02/11 16:59:39)


がんばって作ってみましたが,うまくいきません。
10進数以外が入力されたときは,きちんとERRORを表示し,ふたたび入力を要求できました。
でも,OKとしたい「0〜100」では100以外ERRORがかえされます。
配列長を3にしたので100がOKで,0〜99がERRORになってしまったのだと思いますが,どうしたら0〜99もOKと表示できるでしょう?
教えてください。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main(void)
{
  int n=-1,i=0;
  char c[3];

  while (n == -1){
    printf("INPUT NUM > ");
    gets(c);
    for (i=0; i<=2; i++){
      while (isdigit(c[i])==0){
        printf("ERROR\n");
        c[0]='\0';
        printf("INPUT NUM > ");
        gets(c);
      }
    }
    n = atoi(c);
    if (n > 100){
      printf("ERROR\n");
      n = -1;
    } else {
      printf("OK %d\n", n);
    }
  }

  return 0;
}



この投稿にコメントする

削除パスワード

No.19850

Re:つくってみましたが・・・
投稿者---BlackWind(2005/02/11 17:49:02)


> 10進数以外が入力されたときは,きちんとERRORを表示し,
> ふたたび入力を要求できました。
> でも,OKとしたい「0〜100」では100以外ERRORがかえされます。
> 配列長を3にしたので100がOKで,0〜99がERRORになってしまったのだと
> 思いますが,どうしたら0〜99もOKと表示できるでしょう?
> 教えてください。

文字列数分 -1 だけ、for()文を回してみましょう。
文字列数をチェックする場合は、strlen() を使用します。
for( i = 0; i <= strlen(c) - 1; i ++ ) {
...
}



この投稿にコメントする

削除パスワード

No.19852

Re:つくってみましたが・・・
投稿者---南野骨茶(2005/02/11 18:27:17)


>文字列数分 -1 だけ、for()文を回してみましょう。
>for( i = 0; i <= strlen(c) - 1; i ++ ) {

for文は正しいですが、解説が正しくありません。
例えば「100」を入力として与えると、strlen()の結果は
3ですので、0〜(3-1)の「3」回、
つまり文字列長の回数だけループします。


この投稿にコメントする

削除パスワード

No.19851

Re:つくってみましたが・・・
投稿者---しっぽ(2005/02/11 18:03:51)


char c[4];

for (i=0; i<4 && c[i] != '\0'; i++){

で動くようになると思います。ただし、入力される文字数が4文字以上に
なるとメモリにオーバーランが起こるのではないかと。





この投稿にコメントする

削除パスワード

No.19853

Re:つくってみましたが・・・
投稿者---南野骨茶(2005/02/11 18:30:17)


>ただし、入力される文字数が4文字以上に
>なるとメモリにオーバーランが起こるのではないかと。

そうですね。
入力文字列の長さをいっさいチェックしないgets()を
使ってはいけません。>micさん
fgets()の方がよいでしょう。


この投稿にコメントする

削除パスワード

No.19855

Re:つくってみましたが・・・
投稿者---かずま(2005/02/11 21:30:57)


isdigit を使わないやり方なので、参考にならないかもしれませんが、
こんなプログラムも書けます。
#include <stdio.h>

int main(void)
{
    int n;  char buf[256], c;

    for (;;) {
        if (fgets(buf, sizeof buf, stdin) == NULL) return 1;
        if (sscanf(buf, "%d %c", &n, &c) == 1 && n >= 0 && n <= 100) break;
        puts("ERROR");
    }
    printf("OK %d\n", n);
    return 0;
}



この投稿にコメントする

削除パスワード

No.19856

何度もありがとうございました。
投稿者---mic(2005/02/11 22:23:24)


fgets()はファイル入力関数ですよね?まだ,勉強していないので,これからしっかり学ぼうと思います。
とりあえず,strlen()を使ってプログラムは完成できました。
みなさん,ありがとうございました。
あと,良いC言語のテキストがあれば教えていただきたいのです。今使っているものは,具体例が少なくてライブラリ関数などの使い方が今ひとつわかりずらくて。


この投稿にコメントする

削除パスワード

No.19859

Re:何度もありがとうございました。
投稿者---南野骨茶(2005/02/12 04:35:52)


>fgets()はファイル入力関数ですよね?

第3引数にstdinと書けば、標準入力(よくあるのはキーボード)からの
入力を受け取れます。
かずまさんがお作りになったサンプルにも載っています。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧