• ベストアンサー

atoiでの文字列以外のエラー処理(初心者)

超初心者の質問です 1~3の数値のみ入力してほしい場合 _getts(Word); number = atoi(Word); if( 1<= nunber && 11 >= nunber ){ brerk }; とするとnunberの中に1~11が入るはずですが これを実行すると文字列を入力したときにヘンテコなエラーが出ます ちなみに%dでとればいいのでしょうがscanfは変なエラーでるときが多いので 嫌いなので使いたくありません 悩んだ挙句こうしてみましたが _getts(Word); if( "1"<= nunber && "11" >= nunber ){ number = atoi(Word); brerk; }; これでもエラーが出ます 1文字1文字for文で回して数字かどうか判定してあげるしかないのでしょうか? すっきりした書き方があればよろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★strtol() 関数を使ってみる。 ・この関数ならば文字列を整数に変換する以外に数字文字列以外はエラーもチェックできます。  下にサンプルを載せます。 サンプル: #include <stdio.h> #include <stdlib.h> #include <errno.h> char buff[ 64 ]; char *check; long number; ←ナンバーはnu[m]berです。 while ( fgets(buff,sizeof(buff),stdin) != NULL ){  number = strtol( buff, &check, 10 );    if ( errno == ERANGE ){   puts( "number が長整数の範囲を超えました。" );  }  else if ( *check != '\0' ){   puts( "数字文字列ではありません。" );  }  else if ( (number >= 1) && (number <= 3) ){   printf( "入力した数は %d です。\n", number );  } } 解説: ・fgets() 関数で文字列を入力します。  その後、strtol() 関数で文字列を整数に変換しています。→atoi() の代わり  そして、グローバル変数の errno の値を調べます。この errno に ERANGE 定数が  セットされていると long 値を越える大きい(小さい)数字文字列ですのでエラーと  します。ERANGE 定数がセットされていない場合は check の位置が NULL 文字ならば  すべて数字文字列であったと判定します。少しでも英字や記号が含まれていると NULL  文字以外になるため、ここで数字文字列以外のエラーを表示します。 ・上記のを踏まえてプログラミングの参考にして下さい。 ・以上。おわり。→下の『参考URL』もどうぞ。

参考URL:
http://www9.plala.or.jp/sgwr-t/lib/strtol.html
KENMISE
質問者

お礼

まだまだ勉強不足でした *check != '\0' これは文字列の後につく終端コードですよね 数字には入らないと考えてよろしいのでしょうか やはり文字を1文字づつ回してあげるのがベストなようですね 勉強になるURLまでありがとうございました ---------------------------------------------------------------------- 文字列 s を、baseで指定された基数でlong型に変換し返却します。このとき、文字列中に変換不可能な文字があった場合には、その文字列のポインタをendptrに格納します。 atol関数は、単に文字列を10進のlong型変数に変換するのみで、文字列中に変換不可能な文字があったときには対応できませんが、strtolを使うと、変換可能な部分についてはきちんと変換し、変換不可能な部分についても情報を得ることができます。更に、baseを指定することにより、好きな基数で変換することができます。

その他の回答 (1)

回答No.1

目的はこういうことでしょうか? #include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) { int n; char buffer[32]; gets_s(buffer, sizeof(buffer)); n = atoi(buffer); if(n >= 1 && n <= 3) { puts("1 - 3 です。"); } else { puts("1 - 3 ではありません。"); } } > とするとnunberの中に1~11が入るはずですが 申し訳ありませんが意味がわかりません。プログラムだけみると1~11が入るとは思えませんのでそう思われる根拠はなんでしょうか。 > ちなみに%dでとればいいのでしょうがscanfは変なエラーでるときが多いので 適切に使用し、適切な処理を行えば変なエラーはでません。 > if( "1"<= nunber && "11" >= nunber ){ "1"は、コンスタントプール"1"のアドレスとnunberの値(初期化されていない値)を比較しています。 "11"にしても同様です。 "1"は文字列(キャラクタ配列)。'1'はキャラクタ。1は数値。 違いを理解されておりますでしょうか。 文字列はstrcmpとかで比較しましょう。

KENMISE
質問者

お礼

>適切に使用し、適切な処理を行えば変なエラーはでません。 そうなのですか・・・ _tscanf_s(_T(""))でマルチコードにも対応するようにしたのですが まだまだ勉強不足なので使えないものとばかり思ってました "1"< <"11" はアスキーコードに変換して考えるといけるかなと思ったのですが そもそもstrcpyって便利ですね覚えておきます マルチコードだと_tcscpyですね

関連するQ&A

  • 文字列から数字への変換

    文字列から数字への変換にはatoiなどを使うと思うのですが これだと文字として0を変換すると アルファベットなどを変換した場合と 同じになってしまいますよね? 0も入力を受け付けてなおかつ文字列は受け付けないように するにはどのようにすればよいのでしょうか? アドバイス・回答よろしくお願いします

  • 数字以外の文字列判定方法

    フォームで数字以外を入力した場合に、 エラーのアラートを出したいのですが、 その文字列の判定方法及び、アラートの 出し方がわかりません…。 ご存知の方は教えてください。 よろしくお願いします。

  • ”123456”といった整数を文字列に変換、その後、文字列を1文字ごとに整数に変換 

    忙しい中失礼します。 http://oshiete1.goo.ne.jp/qa3424254.htmlでも質問させて頂いたものですが、 今、回答してくださった方の意見を参考に以下の過程をこなそうとしています。 1.整数入力 →scanf関数を使用し、"123456"と入力します。 2.整数を文字列に変換 → printf("Write the SIN: \n");   scanf("%d", &fnum);   printf("%c\n",fnum); で、"123456"と数値を入力しても”123456”という値が返されず、@となってしまいます。 どうすれば入力した数値が文字列として返ってくるのでしょうか? どんな文・関数を使用すれば数字を文字列として使用することが可能になるのでしょうか? 今のところ習っている文はif else, swith case, while for,do whileで、 getcharやstr?(string)という関数は習っていません。なので、どうプログラムを書けばいいのか??さっぱりなのです。 でもgetcharやstr?(string)という関数を使用するしか方法はないものなのでしょうか?  また、それから 3.文字列を1文字ごとに整数に変換  にする場合、どんな文・関数を使用すれば、1文字”ごと”に整数に変換できるのでしょうか? ごめんなさい、分からないのです。プログラム文、ヒントもしくは参考になるページ等があれば教えて下さい。 よろしくお願いします。 <使用環境:フリーソフト(Borland?)C ANSI C>

  • charを使わずに4桁の数字以外を入力したらエラーを表示したいです

    http://oshiete1.goo.ne.jp/qa4515709.html 上記の質問の続きとなります。 C言語で4桁の数字を入力させ、4桁の数字以外が入力されたらエラーを表示し、 4桁の数字が入力されたら、各位の数についていくつかの計算を行いたいです。 回答者の方のアドバイスから、文字列として入力し、字数をstrlenで、各桁の数をisdigitで判別するという方法を教えていただき、 4桁の数字以外が入力されたらエラーを表示することはできましたが、そうすると今度は計算がうまくいかなくなってしまいました。 例えば文字列としてscanf("%s",a);のようにして「1234」という文字列を入力し、これを「1234」という数値として扱うことはできませんか? または、strlen,isdigitを使わずに数値が4桁の整数であるかどうかを判別することはできませんか? もし良い方法をご存知の方いましたら、解説をお願いします。

  • perl:文字列を数値として変換 警告でないように

    ある変数に 文字列として 数値が格納されている。 ノイズがあり、時には その変数に 英字数字のごちゃ混ぜ文字列が入るときがある。 文字列には数字だけが入っている前提で処理すると、時に その場合、Argument "○○"isn't numeric in addition・・・エラーがでてしまう。 このエラーを出力したくない、エラーログファイルに 読込エラーだったレコード内容を吐き出すようにしたい。 文字列が数字のみで構成されている場合は ○○を実行し、数字以外で構成されている場合は XXを実行するという if文を作成したいと考えている。よい判定方法を教えてください。 現在は、 $i=$i+0; if( $i =~ /^\d+$/ ){ ○○} else{ XX}としているが、 $i=$i+0; の行でエラーが出てしまうときがある。

  • 入力値が1以下、かつ数字以外の文字の場合・・・

    皆様の知恵を貸してください!! 素数判定問題で、 「入力値が1以下、かつ数字以外の文字の場合、その旨 エラーメッセージとして表示&再入力させる」 という要求事項があるのですが… /* キーボードからの入力を受け付ける */ scanf("%d", &number); /**== 入力値をチェック ==**/ /* 入力値が1以下の場合、再入力を促す */ while(number <= 1) { printf("2以上の数を入力してください。\n"); } /* 入力値が数字以外の文字の場合、再入力を促す */ while(★) { printf("数字を入力してください。\n"); } 上記ソースの★のところになんと入れて良いかわかりません!! 課題の提出が明日なので…。 大至急、教えてください。よろしくお願いします!

  • C++流入力の妥当性チェック方法

    お世話になります。 C言語の入門書には、scanfを使って数字を入力させる時は、一旦文字列に入力させ、atoiを使って数値に変換すると良いと書いてありました。 #include "stdafx.h" #include "iostream" #include "cstring" #include "string" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int num=0; // char tmp[20]; string tmp; num=atoi(gets(tmp)); cout << num; return 0; Cの本にかいてある物をC++っぽく書いてみたつもりです。 しかしこれではchar tmp[20]を使ったとき、入力した文字列が数字以外の時はnum=0になってしまい、入力として0を与えたのか入力エラーなのか判定できません。 また、tmp[20]としているので、20文字以上入力された場合、実行エラーが発生してしまいます。 そこで、string tmpとしてやることで、入力される文字数を考えることなくプログラミングできるようにすればいいじゃないかと考えたのですが、atoiはcharにしか対応していないので、stringでは使えません。 stringを使って入力される文字数問題を考えることなく、また、数字以外の入力を受け付けないようにするスマートな方法はないのでしょうか?

  • EXCEL 数値と文字列の共存

    凄く初歩的な質問だとは思うのですが解決出来なくて困っています。 ユーザーフォーム上のテキストボックスから セルに入力をする時に 485768 っと数値を入力すると入力はされますが 「数値が文字列として入力されています」 とエラーが出てしまします。 これだけなら「str」ってのを使うと解決するのですが その同じテキストボックスで 3RD-544 のような文字列も入力します。 これだと「str」だとエラーが出てしまいます。 しかし「val」で解決します。 でも、すると数値のみの時にエラーが出てしまします。 ・・・要するに文字列もしくは標準で入力したいのです。 if構文で数値の時は「str」、文字列の時は「val」 のように凄く回りくどくやれば出来そうな気はするのですが もっとさくっと出来る方法はないでしょうか?

  • C言語:四則演算プログラムで、数字以外の文字が入力された場合のエラー処理について

    お世話になります。 int main( int argc, char *argv[] ) { 上記で、例えばコマンドラインで「実行ファイル名 10 + 20」と入力すると 10+20を計算する、というような四則演算プログラムを作っております。 int num1, num2; num1 = atoi( argv[1] ); num2 = atoi( argv[3] ); 上記の例でしたら、num1、num2 に「10」、「20」の整数値が入りますが、 「数字以外の文字が入力された場合」のエラー処理に悩んでいます。 例えば上記の例で、 「実行ファイル名 a + 20」 「実行ファイル名 a10 + 20」 などと入力された場合、 num1 = atoi( argv[1] ); で、atoi関数が「0」を返すので、 num1に整数の0が入りますよね。 そこで最初、num1 = atoi( argv[1] ); に「整数の0」が入った場合 エラーを出して終了、と云う形にしようと考えました。 ただ、これでは「0+20」などと入力した場合もエラーになってしまうので、 if文を用いて、 「argv[1][0]の値が、'0'という文字列ではない場合に」 「num1 = atoi( argv[1] )」で「num1に整数の0が入ったら」「エラー」 という形で考えました。 しかしこの場合、 「実行ファイル名 100abc + 20」 などと入力されると、atoi関数が「100」を返してくるので 「100+20」が実行結果として出てきてしまいます。 「100abc」の「abc」部分を、どのように判断すれば宜しいのでしょうか。 四則演算プログラムとしての全体は何とか出来上りましたが、 このエラー処理で行き詰まりました。 頑張って検索してみたのですが、Cを始めてまだ2週間程度でして、 上手い方法がどうしても思い浮かびません。 どのような方法でエラー処理を行えば宜しいのでしょうか・・・ 補足要求、質問の意味が判らない、等ございましたらご指摘お願いします。 宜しくお願い致します。

  • エラー処理

    万年カレンダーを作っています。 while(1){ printf(" 西暦年>"); scanf("%d",&year); /*西暦年入力*/ printf("   月>"); scanf("%d",&month); /*月入力*/ if(year>0 && month>0 && month<13){     break; } else{ printf("正しく入力してください\n"); } 上記のように、数字のエラー処理をしたのですが、これに数字以外のモノが入力された場合のエラー処理も追加しなければなりません。