文字列を int に変換します (ただし、実際に int である場合のみ)
-
19-09-2019 - |
質問
大学で、コマンドライン引数から入力された文字列が整数であるかどうかをプログラムが検出するかどうかを尋ねられましたが、検出しませんでした(./Program 3.7
)。さて、どうすればこれを検出できるか考えています。したがって、たとえば次のように入力します a
atoi が検出した無効ですが、たとえば次のように入力します 3.6
は無効であるはずですが、atoi はこれを整数に変換します。
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc > 1) {
int number = atoi(argv[1]);
printf("okay\n");
}
}
ただし、もちろん ok は、argv[1] が実際に整数の場合にのみ出力されるべきです。私の質問が明確になることを願っています。どうもありがとう。
解決
strtolはのを見てください。
endptrがNULLでない場合、strtolは()は* endptrに最初の無効な文字のアドレスを格納します。何の数字がすべてではありませんでした場合は、しかし、strtolはは()*のendptrをにおけるSTRの元の値を格納します。 (このように、*のstrは文字列全体が有効だった、リターン時に\ 0' を
\0' but **endptr is
されていない場合。)
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc > 1) {
char* end;
long number = strtol(argv[1], &end, 0);
if (*end == '\0')
printf("okay\n");
}
}
他のヒント
コードでそれをどのように実行できるかを知りたいと仮定すると (実際に宿題であれば可能です)、1 つの方法は、文字列の観点から整数を構成するものを考えることです。最も可能性が高いのは次のとおりです。
- オプションの記号 +/-。
- 必須の数字。
- 任意の桁数 (ただし、オーバーフローに注意してください)。
- 文字列の終わり。
その仕様に基づいて、作業を行う関数を作成できます。
次のような疑似コードから始めるとよいでしょう。
set sign to +1.
set gotdigit to false.
set accumulator to 0.
set index to 0.
if char[index] is '+':
set index to index + 1.
else:
if char[index] is '-':
set sign to -1.
set index to index + 1.
while char[index] not end-of-string:
if char[index] not numeric:
return error.
set accumulator to accumulator * 10 + numeric value of char[index].
catch overflow here and return error.
set index to index + 1.
set gotdigit to true.
if not gotdigit:
return error.
return sign * accumulator.
int okay = argc>1 && *argv[1];
char* p = argv[1];
int sign = 1;
int value = 0;
if( *p=='-' ) p++, sign=-1;
else if( *p=='+' ) p++;
for( ; *p; p++ ) {
if( *p>='0' && *p<='9' ) {
value = 10*value + *p-'0';
} else {
okay = 0;
break;
}
}
if( okay ) {
value *= sign;
printf( "okay, value=%d\n", value );
}
の編集:許可 - と+文字の
あなたも、密な一次元又は二ライナーにこれを圧縮することができます。それとも、同じ機能を持つライブラリ関数を見つけることができます;)
のEDIT2:ちょうど楽しみのために - それは今の数を解析する必要があります。の