超初心者の質問です
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文で回して数字かどうか判定してあげるしかないのでしょうか?
すっきりした書き方があればよろしくお願いします
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とかで比較しましょう。
>適切に使用し、適切な処理を行えば変なエラーはでません。
そうなのですか・・・
_tscanf_s(_T(""))でマルチコードにも対応するようにしたのですが
まだまだ勉強不足なので使えないものとばかり思ってました
"1"< <"11" はアスキーコードに変換して考えるといけるかなと思ったのですが
そもそもstrcpyって便利ですね覚えておきます
マルチコードだと_tcscpyですね
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
まだまだ勉強不足でした
*check != '\0' これは文字列の後につく終端コードですよね
数字には入らないと考えてよろしいのでしょうか
やはり文字を1文字づつ回してあげるのがベストなようですね
勉強になるURLまでありがとうございました
----------------------------------------------------------------------
文字列 s を、baseで指定された基数でlong型に変換し返却します。このとき、文字列中に変換不可能な文字があった場合には、その文字列のポインタをendptrに格納します。
atol関数は、単に文字列を10進のlong型変数に変換するのみで、文字列中に変換不可能な文字があったときには対応できませんが、strtolを使うと、変換可能な部分についてはきちんと変換し、変換不可能な部分についても情報を得ることができます。更に、baseを指定することにより、好きな基数で変換することができます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
- その他(パソコン・周辺機器) WINDOWS11 IMEの日本語入力で困っています 4 2023/04/29 19:24
- Excel(エクセル) エクセル 関数について質問です。 2 2022/10/03 11:14
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- Excel(エクセル) エクセルのマイナス表示 3 2022/03/28 16:35
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Excel(エクセル) Excelの関数についておしえてください。 3 2023/04/20 18:36
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
sscanfとscanfの違いがよくわか...
-
CStringのFindで文字列検索を行...
-
反転した数値を表示させるやり方
-
C言語で16進数文字列から16進数...
-
fgets関数を使用したときの文字...
-
小文字のみを数える方法
-
記号を入出力する際の指定子
-
strstrを利用しない文字列検索...
-
itoaわかりません
-
C言語:配列の中の文字を。。。
-
2進数から10進数へ変換プログラム
-
C言語のステップ数をカウントす...
-
[Java]文字列分割
-
10進数文字列の変換
-
Cで「大文字、小文字の判定」は...
-
charと%c , %s の関係について
-
へんな現象
-
Enterキーを押されたら次の処理...
-
#define _CRT_SECURE_NO_WARNIN...
-
マイナスからプラスへ転じた時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
反転した数値を表示させるやり方
-
fgets関数を使用したときの文字...
-
C言語 空白の行(改行のみ)が...
-
charと%c , %s の関係について
-
C言語のステップ数をカウントす...
-
fgetsで拾われる改行文字を削除...
-
itoaわかりません
-
C言語で16進数文字列から16進数...
-
strstrを利用しない文字列検索...
-
文字列中に含まれる文字の個数...
-
Cで「大文字、小文字の判定」は...
-
エディットボックスに入力され...
-
1行の文字列を時間差で表示する...
-
文字列の途中に「0」がある場...
-
[Java]文字列分割
-
教えていただけませんか?C言語...
-
atoiでの文字列以外のエラー処...
-
ブランクのチェック
おすすめ情報