掲示板利用宣言

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

 私は

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

掲示板2

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

No.27762

scanf関数での桁数入力チェック
投稿者---tosi(2006/07/31 16:46:25)


はじめまして

scanf関数を使って10桁などの大きい数字を入力したと
きにエラーメッセージを表示したいのですがうまくい
きません。scanf関数のみしか使ってはいけないのですが
、ご教授願えないでしょうか?

#include <stdio.h>

int main(void)
{
    int no;
    
    printf("整数を入力してください:");
    scanf("%d", &no);
    
    if(no > 32767 && no < -32768)
    {
        printf("入力した数字が大きすぎるか小さすぎます\n");
    }
    
    else
    {
        printf("あなたは%dと入力しましたね。\n", no);
    }
    
    return(0);
}



限界値を入力するとエラーメッセージが出てくれるのです
が桁数が多くなるとできません。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:scanf関数での桁数入力チェック 27763 円零 2006/07/31 17:11:35
<子記事> Re:scanf関数での桁数入力チェック 27764 ruby 2006/07/31 17:15:25
<子記事> Re:scanf関数での桁数入力チェック 27767 たかぎ 2006/07/31 17:58:28


No.27763

Re:scanf関数での桁数入力チェック
投稿者---円零(2006/07/31 17:11:35)


本当にscanfしか使っちゃいけないのであれば、%cか何かで一文字ずつ読み込んでいくしかないんじゃないかな。


この投稿にコメントする

削除パスワード

No.27765

Re:scanf関数での桁数入力チェック
投稿者---acid(2006/07/31 17:18:32)


http://seclan.dll.jp/c99d/c99d05.htm

このURLの真ん中辺りの表を見てください。
表に書いてありますが、intというのは-32,767から+32,767までしか数字を格納できません。
なのでどう頑張っても32,767以上の数字のチェックはできません。

ではどうするかというと、intの下にlong型というのがあります。
これはなんと+2,147,483,647まで格納できます。
ちょうど10桁ありますので、これでチェックできますね。

まぁlongでも30億とか入力したらダメなんですが、例文がintの限界値でifしてるので、
先生の意図は多分これであっていると思います。多分。



この投稿にコメントする

削除パスワード

No.27772

Re:scanf関数での桁数入力チェック
投稿者---ruby(2006/07/31 21:21:50)


>表に書いてありますが、intというのは-32,767から+32,767までしか数字を格納できません。
>なのでどう頑張っても32,767以上の数字のチェックはできません。

sizeof(int) == sizeof(short) の処理系では、という条件が付きますよね?

# このとき、signed intの範囲は-32768〜+32767ではなかろうか?
# 表が間違ってないか?


この投稿にコメントする

削除パスワード

No.27773

Re:scanf関数での桁数入力チェック
投稿者---ruby(2006/07/31 21:23:59)


># このとき、signed intの範囲は-32768〜+32767ではなかろうか?
># 表が間違ってないか?

# 補数の関係で、-32767〜+32767という場合もある?
# なんか独白ばっかり…。


この投稿にコメントする

削除パスワード

No.27774

Re:scanf関数での桁数入力チェック
投稿者---YuO(2006/07/31 21:41:42)


>># このとき、signed intの範囲は-32768〜+32767ではなかろうか?
>># 表が間違ってないか?

間違っていません。


># 補数の関係で、-32767〜+32767という場合もある?

補数というか,負数の表現方法の問題ですね。
1の補数だとか,符号フラグ方式だと,+0と-0があるので-32767までになります。



この投稿にコメントする

削除パスワード

No.27775

Re:scanf関数での桁数入力チェック
投稿者---たかぎ(2006/07/31 21:57:05)
http://takagi.in/


>補数というか,負数の表現方法の問題ですね。
>1の補数だとか,符号フラグ方式だと,+0と-0があるので-32767までになります。

負数を2の補数で表現する場合でも、処理系は、最上位ビットが1で他のビットが0の場合をトラップ表現とみなしてもよいので、その場合だと-32767〜+32767になりますね。



この投稿にコメントする

削除パスワード

No.27764

Re:scanf関数での桁数入力チェック
投稿者---ruby(2006/07/31 17:15:25)


本題とは異なる指摘をします。
>     if(no > 32767 && no < -32768)

ここはand条件ではなくてor条件ですね?


この投稿にコメントする

削除パスワード

No.27767

Re:scanf関数での桁数入力チェック
投稿者---たかぎ(2006/07/31 17:58:28)
http://takagi.in/


こんなのでどうでしょうか?
細かなエラーチェックまではしていません。

#include <stdio.h>

int main(void)
{
  char s[10+1], c;

  printf("整数を入力してください:");
  scanf("%10[0-9]%c", s, &c);

  if ('0' <= c && c <= '9')
  {
    printf("入力した数字が大きすぎるか小さすぎます\n");
  }
  else
  {
    printf("あなたは%sと入力しましたね。\n", s);
  }
  return 0;
}




この投稿にコメントする

削除パスワード

No.27768

Re:scanf関数での桁数入力チェック
投稿者---たかぎ(2006/07/31 18:03:29)
http://takagi.in/


long long型が使えるなら、これでもいいと思います。

#include <stdio.h>

int main(void)
{
  long long n;
  char c;

  printf("整数を入力してください:");
  scanf("%10lld%c", &n, &c);

  if ('0' <= c && c <= '9')
  {
    printf("入力した数字が大きすぎるか小さすぎます\n");
  }
  else
  {
    printf("あなたは%lldと入力しましたね。\n", n);
  }
  return 0;
}




この投稿にコメントする

削除パスワード

No.27770

Re:返信ありがとうございます
投稿者---tosi(2006/07/31 20:14:15)


返信ありがとうございました。

円零様
>本当にscanfしか使っちゃいけないのであれば、
%cか何かで一文字ずつ読み込んでいくしかない
んじゃないかな。

1文字ずつ配列に入れる事にしました。


acid様
>ちょうど10桁ありますので、これでチェックできますね。
 まぁlongでも30億とか入力したらダメなんですが

30桁などでもできるようにしたかったです、
すいません説明不足でした。


ruby様
>if(no > 32767 && no < -32768)
 ここはand条件ではなくてor条件ですね?

すいません間違えました、あるはずのない数でした。


たかぎ様
>こんなのでどうでしょうか?
 scanf("%10[0-9]%c", s, &c);

書式付のscanfでできたんですね、ありがとうございました。



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

main()
{
    char suuji[128];
    int no = 0;
    
    printf("数字を1つ入力してください --> ");
    scanf("%s", suuji);
    
    if(suuji[5] != '\0')
    {
        printf("入力桁数が多すぎます\n");
    }
    
    else
    {
        no = atoi (suuji);

        printf("あなたは%dと入力しましたね。\n", no);
    }
}


とやりました。限界値のチェックができなくなりましたが
桁数はチェックできました、ありがとうございました。




この投稿にコメントする

削除パスワード

No.27771

Re:返信ありがとうございます
投稿者---rvr_driver(2006/07/31 20:47:57)


因みにint型の最大値はINT_MAX、最小値はINT_MINとしておくと環境依存でなくなります。
他の型もlimits.hに定義されているので見てみてはいかがでしょうか?
(long型の最大値だったらLONG_MAXなど)

# タイムリーにレスが付けられない...orz


この投稿にコメントする

削除パスワード

No.27781

Re:返信ありがとうございます
投稿者---円零(2006/07/31 23:40:22)


この制約で環境依存じゃなくすのは結構大変。

#include <stdio.h>
#include <limits.h>

int main(void){
    char c;
    int i, no = 0, sign = 1, flag = 0, boundary, msd, log;

    printf("数字を1つ入力してください --> ");
    scanf("%c", &c);
    if(c == '-'){
        sign = -1;
        scanf("%c", &c);
        boundary = INT_MIN;
    }
    else boundary = INT_MAX;
    while(c == '0') scanf("%c", &c);
    while(i = c - '0', i >= 0 && i <= 9){    
        if(!boundary) goto overflow;
        msd = boundary;
        log = 0;
        while( (sign == 1 && msd >= 10) || (sign == -1 && msd <= -10) ){
            msd /= 10;
            log++;
        }
        if(!flag){
            if(sign * i > msd) flag = sign;
            if(sign * i < msd) flag = -sign;
        }
        while((log -= 1) >= 0) msd *= 10;
        boundary -= msd;
        no = no * 10 + sign * i;
        scanf("%c", &c);
    }
    if(!boundary && flag == 1) goto overflow;
    printf("あなたは%dと入力しましたね。\n", no);
    return 0;

    overflow:
    printf("入力した数字が大きすぎるか小さすぎます\n");
    return 0;
}

ダサダサだけど一応mainとscanfとprintfしか関数使ってないプログラム。


この投稿にコメントする

削除パスワード

No.27807

Re:返信ありがとうございます
投稿者---tosi(2006/08/02 00:47:31)


これだと32767〜−32767までチェックできるのですね、
ありがとうございました。
このプログラムを参考にさせてもらいます、変な質問であったかも
しれませんが皆様返信ありがとうございました。
解決しました。


この投稿にコメントする

削除パスワード

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