エンドポインターを使用strtol()
しstrtod()
て比較することで、これを行うことができます。たとえば、次のようになります。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char buffer[100];
char * endptr_n;
char * endptr_d;
long n;
double d;
fgets(buffer, 100, stdin);
n = strtol(buffer, &endptr_n, 10);
if ( endptr_n == buffer ) {
fputs("You didn't enter a number.", stderr);
return EXIT_FAILURE;
}
d = strtod(buffer, &endptr_d);
if ( *endptr_d == '\0' || *endptr_d == '\n' ) {
if ( endptr_d == endptr_n ) {
puts("You entered just a plain integer.");
} else {
puts("You entered a floating point number - invalid.");
}
} else {
puts("You entered garbage after the number - invalid.");
}
return EXIT_SUCCESS;
}
出力:
paul@local:~/src/c$ ./testint
2
You entered just a plain integer.
paul@local:~/src/c$ ./testint
2.3
You entered a floating point number - invalid.
paul@local:~/src/c$ ./testint
3e4
You entered a floating point number - invalid.
paul@local:~/src/c$ ./testint
4e-5
You entered a floating point number - invalid.
paul@local:~/src/c$ ./testint
423captainpicard
You entered garbage after the number - invalid.
paul@local:~/src/c$
は使用しませんがscanf()
、それは良いことであり、読み取った整数に続く入力を手動でチェックする必要がなくなります。
strtol()
明らかに、回線上の唯一のものが番号である場合、電話してすぐに確認できるため、これの多くは不要になりますが*endptr_n
、回線上に他のものがある可能性がある場合は、これを行う方法です。整数の後に数値以外が続くものは受け入れたいが、浮動小数点の後に同じものが続くのは受け入れたくない場合は、if ( *endptr_d == '\0' || *endptr_d == '\n' )
ロジックを削除するだけです。
編集: にチェックを表示するようにコードを更新しました*endptr
。