2009-05-08 16 views

答えて

2

その数字かどうかをチェックすることができます:

char c; 
scanf("%c", &c); 
if(isdigit(c)) 
    printf("You entered the digit %c\n", c); 
+1

参照:isalpha、ispunct、islower、isupperなど... http://www.cppreference.com/wiki/c/string/start – Eclipse

+0

入力検証にscanf(またはfscanf)を使用するのは良い考えではありませんセキュリティエラーを作成する危険性が高くなります。理論的には安全に行うことができますが( "%c"にする必要があります)、scanfを一緒に避けるほうがずっと良いです。 http://www.atsec.com/downloads/pdf/secure-coding-guidelines.pdfの便利な情報 – hlovdal

1

あなたはatoi関数またはatofを使用して、この関数によって返された値が0でない場合は、ユーザーが入力した可能性があり、これは絶対確実ではありませんチェックすることができます " 0 'である。

もう1つの方法は、文字列のすべての文字が[0-9]、+/-または小数点のいずれかであることを確認し、一致しないすべての文字列を拒否することです。

+0

atoiは文字列 "23 skidoo"に対して非ゼロを返します。したがって、入力の検証にはお勧めできません。 –

+0

おっと、それは良くありません。私は最近Cを書いていないので、それは私を逃げました... –

2
int isNum; 
if ((isNum = strtol(string, NULL, 10))) 
    printf(" '%d' numbers was found!\n", isNum); 
else 
{ 
    printf("No number found"); 
} 

無効な文字で始まる文字列の場合、すべての有効な文字が変換されます。この関数はゼロ(0)を返します。

strtol() example これは、数字の後に続く文字や数値ではない文字列の部分を出力する方法を示しています。

又は

int isNum 
isNum = atoi(string); 
+0

isdigit(string [i])を意味しますか?さもなければ、あなたは "48"と "57"の間の数字を表す文字列を受け入れます。 – Eclipse

+0

がより良いアンサーで更新されました – TStamper

+0

あなたはまだstrtolが成功したかどうかを確認するための適切な方法を使用していません。適切な方法は、* nptrが '\ 0'ではなく** endptrが '\ 0'である場合です。 –

7

コールstrtolは、endptrをに格納された値(文字列全体を使用した)入力(成功変換)に等しくなく、NULバイトへのポインタであることを確認。

http://www.opengroup.org/onlinepubs/000095399/functions/strtol.html

あなたもオーバーフローを検出したい場合は、トリックはあなたが知識をひけらかすようにしたい場合はerrnoにはまだ0

であることを確認した後、strtolはを呼び出した後、0をerrnoに設定することであると説明していますisspace()を使って、入力文字列の最初の文字が空白でないことを確認する必要もあります。その理由は、strtolと友人が最初の空白をスキップしますが、おそらく "1"は有効な数字ではないと考えます。

より大きい数値または非整数の数値を許可する場合は、代わりにstrtollとstrtodをそれぞれ使用します。

1

あなたはあなたが何を期待しているのかを指定していません。有効な入力セットに応じて、他のものが指定した数の標準ライブラリ関数を呼び出すことができます。例:浮動小数点数が必要な場合は、数字であるかどうかの単純なチェックは機能しません。また、ライブラリ関数を呼び出すだけでは不十分ですが、戻り値(変換中に発生したエラーがあればエラー)もチェックする必要があります。

また、sscanf関数を使用して数値を取得することもできます。

最後に、整数は、intまたはその変形(longなど)または浮動小数点数として格納できます。電話はあなたのものです。

2

ここでは優れたヒューリスティックがたくさんあります。

入力を厳密に定義したい場合は、独自のレクサー/パーサーを作成して、標準のライブラリ関数を変更するのではなく、意図した言語を正確に受け入れることができます。

これは実質的なトピックです。「コンパイラをビルドする方法」の1つを参照してください。参照のためのStackOverflowに関する質問...(例:Learning to write a compiler

0

strtol、atoi、atof ..のような関数を使用する代わりに、文字列の文字を解析して出力整数を構築する独自の関数を定義できます。この解析中に文字が非数字の場合、NaNの文字列を安全に言うことができます。または、isdigit()を使用して各文字をチェックし、すべての文字が数字の場合は、atoiを使用して文字列をnumberに変換します。

関連する問題