ユーザからの文字列入力です。しかし、どのように私はユーザーが文字列か数字を入力したかどうかを確認するのですか?ユーザの入力がCを使用して有効な文字列かどうかを確認してください。
答えて
その数字かどうかをチェックすることができます:
char c;
scanf("%c", &c);
if(isdigit(c))
printf("You entered the digit %c\n", c);
あなたはatoi関数またはatofを使用して、この関数によって返された値が0でない場合は、ユーザーが入力した可能性があり、これは絶対確実ではありませんチェックすることができます " 0 'である。
もう1つの方法は、文字列のすべての文字が[0-9]、+/-または小数点のいずれかであることを確認し、一致しないすべての文字列を拒否することです。
atoiは文字列 "23 skidoo"に対して非ゼロを返します。したがって、入力の検証にはお勧めできません。 –
おっと、それは良くありません。私は最近Cを書いていないので、それは私を逃げました... –
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);
コールstrtolは、endptrをに格納された値(文字列全体を使用した)入力(成功変換)に等しくなく、NULバイトへのポインタであることを確認。
http://www.opengroup.org/onlinepubs/000095399/functions/strtol.html
あなたもオーバーフローを検出したい場合は、トリックはあなたが知識をひけらかすようにしたい場合はerrnoにはまだ0
であることを確認した後、strtolはを呼び出した後、0をerrnoに設定することであると説明していますisspace()を使って、入力文字列の最初の文字が空白でないことを確認する必要もあります。その理由は、strtolと友人が最初の空白をスキップしますが、おそらく "1"は有効な数字ではないと考えます。
より大きい数値または非整数の数値を許可する場合は、代わりにstrtollとstrtodをそれぞれ使用します。
あなたはあなたが何を期待しているのかを指定していません。有効な入力セットに応じて、他のものが指定した数の標準ライブラリ関数を呼び出すことができます。例:浮動小数点数が必要な場合は、数字であるかどうかの単純なチェックは機能しません。また、ライブラリ関数を呼び出すだけでは不十分ですが、戻り値(変換中に発生したエラーがあればエラー)もチェックする必要があります。
また、sscanf
関数を使用して数値を取得することもできます。
最後に、整数は、int
またはその変形(long
など)または浮動小数点数として格納できます。電話はあなたのものです。
ここでは優れたヒューリスティックがたくさんあります。
入力を厳密に定義したい場合は、独自のレクサー/パーサーを作成して、標準のライブラリ関数を変更するのではなく、意図した言語を正確に受け入れることができます。
これは実質的なトピックです。「コンパイラをビルドする方法」の1つを参照してください。参照のためのStackOverflowに関する質問...(例:Learning to write a compiler)
strtol、atoi、atof ..のような関数を使用する代わりに、文字列の文字を解析して出力整数を構築する独自の関数を定義できます。この解析中に文字が非数字の場合、NaNの文字列を安全に言うことができます。または、isdigit()を使用して各文字をチェックし、すべての文字が数字の場合は、atoiを使用して文字列をnumberに変換します。
- 1. 有効なディレクトリ名の文字列を確認してください
- 2. C++、入力値が特定の文字かどうかを確認してください
- 3. 古いfacebookのアクセストークンが有効かどうか確認してください
- 4. URLが有効かどうかを確認してください。
- 5. URLがAndroidで有効かどうかを確認してください。
- 6. C文字列がCの有効なintかどうかを確認
- 7. 入力文字列が有効なVB文字列かどうかを確認する方法は?
- 8. Enterキーを押す前にユーザが何か入力していないか確認してください
- 9. 入力がリンクであるかどうかを確認してください
- 10. フォームへのテキスト入力がユニコードかどうか確認してください。
- 11. Strongloopを使用してdbにユーザが存在するかどうかを確認してください
- 12. どのようなcssホバー状態が有効になっているかを確認してください
- 13. 文字列に別の文字列が含まれていないか確認してください。
- 14. 文字列がJavascriptを使用してhttpで始まっているか確認してください。
- 15. Flashを使用して入力ファイルのサイズを確認してください
- 16. 入力Jqueryの開始文字の値を確認してください
- 17. 2つの文字列が同じパターンの繰り返し文字を共有しているかどうか確認してください。
- 18. 正確な場所にユーザ入力を入力してください
- 19. 文字列の書式を確認してください
- 20. 文字列にリストにない文字が含まれていないか確認してください。
- 21. jQuery:文字列内に特殊文字が存在するかどうか確認してください。
- 22. Pylonsアプリケーションでデバッグが有効になっているかどうか確認してください
- 23. BlackBerry gpsが有効になっているかどうか確認してください
- 24. QFontが特定のUTF-8文字をサポートしているかどうかを確認してください
- 25. ユーザー入力にエレガントなエラーを確認してください
- 26. 文字列に何かがあるか確認してください。
- 27. ワイルドカードリゾルバでドメインの有効性を確認してください
- 28. OracleDependencyの有効性を確認してください
- 29. Android:文字列を入力してください
- 30. スペースで文字列を入力してください
参照:isalpha、ispunct、islower、isupperなど... http://www.cppreference.com/wiki/c/string/start – Eclipse
入力検証にscanf(またはfscanf)を使用するのは良い考えではありませんセキュリティエラーを作成する危険性が高くなります。理論的には安全に行うことができますが( "%c"にする必要があります)、scanfを一緒に避けるほうがずっと良いです。 http://www.atsec.com/downloads/pdf/secure-coding-guidelines.pdfの便利な情報 – hlovdal