掲示板ランキング  西洋ハーブ(ネトル)  東洋ハーブ(高麗人参エキス)


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

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

No.6308

数値入力チェックはisdigit関数使用で良いのでしょうか?
投稿者---コウ(2006/08/15 16:00:49)


isdigit関数を使用すれば、下記の目的が達成できると考えました
注)下記に添付ソースあり

(目的)
キーボード入力された文字が数字かチェックをして、
数字でなければ、再入力要求をする

(問題点)
多々、問題があるのですが、下記2点が解決できません
1.isdigit関数は、数字であれば、非0を返すと認識しているのですが、
'45'と入力すると、関数の戻り値は、0が返ってきます
2.'54'と入力すると、戻り値は1が返ります

(質問)
1.isdigit関数は、1バイトずつの確認に使用しないと、動作は保証されてい
ないのでしょうか?

#include <stdio.h>
#include <ctype.h>

main()
{
  int a[5];
  int iL_Cnt;

  /* ユーザから入力される数字を配列に格納する */
  for (iL_Cnt = 0 ; iL_Cnt < 5 ;iL_Cnt ++)
  {
    printf("%d番目の数字を入力して下さい\n",iL_Cnt+1);
    printf("配列aの格納先アドレスは%pです\n",&a + iL_Cnt+1);
    scanf("%d",a + iL_Cnt);

    /* 入力された値が数字かチェック */
    /*if(isdigit(a[iL_Cnt]) == 0 )*/
    /* 数字でなかったら、同じ配列のindexに値が格納されるように準備を行う */
    if(isdigit(a[iL_Cnt]))
    {
      printf("%d 数字を入力して下さい\n",a[iL_Cnt]);
      printf("戻り値は%d 数字を入力して下さい\n",isdigit(a[iL_Cnt]));
      a[iL_Cnt] = 0;
      iL_Cnt --;
    }
    else
    {
      printf("%dは、数字でした\n",a[iL_Cnt]);
      printf("戻り値は%d\n",isdigit(a[iL_Cnt]));
      printf("a[%d]の値は、%dです\n",iL_Cnt,a[iL_Cnt]);
    }
  }

  for (iL_Cnt = 0 ; iL_Cnt < 5 ;iL_Cnt ++)
  {
    printf("%d番目の数字は、%dです\n",iL_Cnt+1,a[iL_Cnt]);
  }

  return(0);

}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:数値入力チェックはisdigit関数使用で良いのでしょうか? 6309 επιστημη 2006/08/15 16:27:11
<子記事> Re:数値入力チェックはisdigit関数使用で良いのでしょうか? 6310 ruby 2006/08/15 16:43:34
<子記事> Re:数値入力チェックはisdigit関数使用で良いのでしょうか? 6311 Blue 2006/08/15 17:36:17


No.6309

Re:数値入力チェックはisdigit関数使用で良いのでしょうか?
投稿者---επιστημη(2006/08/15 16:27:11)


>1.isdigit関数は、1バイトずつの確認に使用しないと、動作は保証されてい
>ないのでしょうか?

マニュアルには何と書いてありますか? それに従ってください。



この投稿にコメントする

削除パスワード

No.6310

Re:数値入力チェックはisdigit関数使用で良いのでしょうか?
投稿者---ruby(2006/08/15 16:43:34)


>'45'と入力すると、関数の戻り値は、0が返ってきます
>2.'54'と入力すると、戻り値は1が返ります

アスキーコードの場合、isdigitにint型の45を渡すと'-'(X'2D'==45)を
渡したことになりますので、偽が返ります。
また、int型の54を渡すと'6'(X'36'==54)を渡したことになりますので、
真が返ります。

当初の目的を満たすには、いったん文字列として受けて、
1バイトずつ数字・非数字をチェック必要があるのではないかと思います。


この投稿にコメントする

削除パスワード

No.6312

Re:数値入力チェックはisdigit関数使用で良いのでしょうか?
投稿者---コウ(2006/08/16 16:28:46)


rubyさん、迅速なご意見ありがとうございました。

本業と、解析に時間を要してしまい、返信が遅くなってしまいました。
申し訳ありません。。。

isdigit関数の使用方法に、誤りがあった事に気付かせて頂きました。

しかし、検証していく中で、一つ確認事項が出ました。

(確認内容)
>アスキーコードの場合、isdigitにint型の45を渡すと'-'(X'2D'==45)を
>渡したことになりますので、偽が返ります。
>また、int型の54を渡すと'6'(X'36'==54)を渡したことになりますので、
>真が返ります。

これは、10進数を16進数に変換した時、1桁目が数字か、文字列かで、
真偽の判定が分かれると言う、解釈で宜しいのでしょうか?

下記、ソースにて解析をした結果、isdigit関数の引数に渡した値が
そのままアスキーコードとして認識されているのではないかと考えました。
つまり、10進数で、48〜57を与えた時は、真(アスキーコードの0〜9)
になり、それ以外は、偽が返ると実行結果より考えました。

私の解釈に誤りがありましたら、ご指摘を頂けないでしょうか?

#include <stdio.h>
#include <ctype.h>

int main( void )
{
    int n;

    for (n = 40 ;n <60 ;n++)
    {
      if (isdigit(n))
      {
        printf("%cは数字です 戻り値は%d\n",n,isdigit(n));
      }
      else
      {
          printf("%cは数字ではありません 戻り値は%d\n",n,isdigit(n));
      }
    }
    return (0);
}




この投稿にコメントする

削除パスワード

No.6314

Re:数値入力チェックはisdigit関数使用で良いのでしょうか?
投稿者---ruby(2006/08/16 17:13:45)


>つまり、10進数で、48〜57を与えた時は、真(アスキーコードの0〜9)
                                      ^^^^^^^^^^^^^^^^^^^^^^^

下線部が疑問です。
十進数の48〜57(アスキーコード体系では'0'〜'9')を与えたときは真(非ゼロの値)、
ということがおっしゃりたかったのでしょうか?


この投稿にコメントする

削除パスワード

No.6316

Re:数値入力チェックはisdigit関数使用で良いのでしょうか?
投稿者---コウ(2006/08/17 10:21:00)


適切な表現でなくて、申しわけありませんでした。

十進数で、48〜57(16進では、0x30〜0x39)を与えると、アスキーコード表
の48〜57(16進では、0x30〜0x39)のコードであるかをチェックしていると
思われる。
なぜなら、アスキーコード表の48〜57は、'0'〜'9'の数字を表しているから。
と言いたかったのです。

アスキーコード体系という表現が、アスキーコードが表す文字を指すので
あれば、rubyさんのおっしゃる事と、見解は一致しております。


この投稿にコメントする

削除パスワード

No.6315

Re:数値入力チェックはisdigit関数使用で良いのでしょうか?
投稿者---rvr_driver(2006/08/16 20:08:41)


>私の解釈に誤りがありましたら、ご指摘を頂けないでしょうか?

コウさんの解釈というよりコンパイラのマニュアルにはどの様に
記載されていますか?(επιστημηさんも指摘されていますよね?)
その記載内容が答えです。

標準ライブラリの関数の仕様がわからない場合はまずマニュアルを読む
ことをお勧めします。調べ方の優先順位として、
1.使用しているコンパイラのマニュアルを確認する
2.コンパイラのマニュアルが入手できない場合、JISX3010を調べる
http://www.jisc.go.jp/app/JPS/JPSO0020.html
3.「新ANSI C言語辞典」などの本で調べる。
http://www.amazon.co.jp/gp/product/4774104329/249-0202650-6751557?v=glance&n=465392

テストコードを書いて推測するというのは絶対だめとは言いませんが
きちんとした答えではありません。

今回の場合、isdigit()の仕様を掲示板で回答を得ることが出来るかも知れませんが、
その回答が正しいかどうかの判断ははどうするのですか?



この投稿にコメントする

削除パスワード

No.6317

Re:数値入力チェックはisdigit関数使用で良いのでしょうか?
投稿者---コウ(2006/08/17 11:10:14)


rvr_driverさん、ご指摘ありがとうございます。

質問をさせて頂くからには、当然使用しているコンパイラ
Lsicの拡張子がMANの中身をチェックし、
C言語辞典も確認しております。

しかし、C言語の解説をどう解釈すれば良いかがわからず、
質問をさせて頂いております。

今回は、辞典には、int isdigit(int c);と定義されておりますが、
MANファイルには、int isdigit(char c);
と記載されているにも関わらず、int型で引数を渡してもコンパイラー
エラーが出ないため、辞書の定義に基づき検証を行いました。

そして、
1.入力チェックを行う際に、何故文字列に置き換えるのか
2.文字Cが10真数字('0'〜'9')であるか検証すると言っている
のは、どういった機能なのかを正しく理解する事を目的として
質問をさせて頂いております。


この投稿にコメントする

削除パスワード

No.6311

Re:数値入力チェックはisdigit関数使用で良いのでしょうか?
投稿者---Blue(2006/08/15 17:36:17)


文字型で scanf しないと、数字以外の値を int 型に入れようとしたとき、
格納できません。
しかも、桁数を指定しないと一気に何桁も入れれますし。

サンプル)

#include <stdio.h>

int main( void )
{
    int n;
    if ( scanf( "%1d", &n ) == 1 ) /* 詳しくはscanf関数の戻り値を確認してください */
    {
        printf( "%d は数字です。\n", n );
    }
    else
    {
        puts( "入力された値は数字ではありませんでした。" );
    }
    return 0;
}




この投稿にコメントする

削除パスワード

No.6313

Re:数値入力チェックはisdigit関数使用で良いのでしょうか?
投稿者---コウ(2006/08/16 17:09:38)


Blueさん、ご教授ありがとうございました。

scanf関数、基本かと思っていましたが、やればやる程、難しく
思えてきました。
整理させて下さい。
確認内容は、下記、ソースを実行した時の内容です。


(確認)
1.数字項目のみを格納する場合でも、皆さん、charの配列を使用していますが、
345tyuと入力した時でも、345までを数字と認識してしまうからでしょうか?
(また、この結果が出力されるscanf関数の動作が全く分かりませんでした)

2.scanfの戻り値は、代入された入力項目の数と辞典に、記載されている
のですが、入力項目の数とは、引数の数の事を言っているのでしょうか?
つまり、345と入力した場合、3文字入力なので、3項目ではなく、1項目であり、
戻り値も1となるという理解で正しいでしょうか?

3.scanfの戻り値は、345rtyと入力すると、0が返るのは、数字以外の文字
が含まれているのに、書式指定が%dになっているからという理解で正しい
でしょうか?

#include <stdio.h>

int main( void )
{
    int n;
    int r;
    
    r = scanf( "%d", &n );
    if ( r == 1 )
    {
        printf( "%d は数字です。\n", n );
    }
    else
    {
        puts( "入力された値は数字ではありませんでした。" );
    }
  printf("scanfの戻り値は%d",r);
    return 0;
}




この投稿にコメントする

削除パスワード

No.6318

Re:数値入力チェックはisdigit関数使用で良いのでしょうか?
投稿者---Blue(2006/08/18 15:28:13)


>1.数字項目のみを格納する場合でも、皆さん、charの配列を使用していますが、
>345tyuと入力した時でも、345までを数字と認識してしまうからでしょうか?
>(また、この結果が出力されるscanf関数の動作が全く分かりませんでした)
数字型で受ける場合、345までを指定した変数に格納します。
で、"tyu" はバッファに残った状態になります。(読み込んでいない状態)
ですので、数字以外の入力を受け付けるためにも、char型配列で受けるのがいいです。

>2.scanfの戻り値は、代入された入力項目の数と辞典に、記載されている
>のですが、入力項目の数とは、引数の数の事を言っているのでしょうか?
>つまり、345と入力した場合、3文字入力なので、3項目ではなく、1項目であり、
>戻り値も1となるという理解で正しいでしょうか?
そうです。文字数や桁数は関係ありません。

>3.scanfの戻り値は、345rtyと入力すると、0が返るのは、数字以外の文字
>が含まれているのに、書式指定が%dになっているからという理解で正しい
>でしょうか?
0 は返りません。1が返るはずです。


ちなみに、普通は入力時に scanf を単独で使うことはあまりないと思います。
まずは、文字型配列で読み込んでおいて(fgets)そのあと、sscanf関数をつかうというのが普通でしょうか。

scanf,fscanf,sscanfの仕様は結構難しいです。(というか私も解説できない)
ですので、いろいろご自分でコードを書いたりして理解していくほうがよいと思います。


ということで、これ以上 scanf に関する質問は答えられない可能性がありますので、ご了承してください。


この投稿にコメントする

削除パスワード

No.6319

Re:数値入力チェックはisdigit関数使用で良いのでしょうか?
投稿者---コウ(2006/08/21 10:44:15)


Blueさん回答ありがとうございました。

>バッファに残った状態(読み込んでいない状態)になるから、
>数字以外の入力を受け付けるためにも、char型配列で受ける
>のがいいです。

納得のいく説明でした。
感謝します!!!


この投稿にコメントする

削除パスワード

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





掲示板提供:(有)リアル・インテグリティ