strtol()を使う時、数値かどうかの判断をどうするのか。
long strtol(
const char * restrict nptr,
char ** restrict endptr
int base
);
nptr が指す文字列中に変換不可能な文字があった場合には,その文字列へのポインタを endptr に格納します.
endptrをチェックすればいいのだろうか。
try1
# include <stdio.h>
void funcStrtol(char *src)
{
int res;
char *endptr;
res = strtol(src, &endptr, 0);
if (strcmp(src, endptr) != 0) {
printf("%d %s\n", res, endptr);
} else {
printf("Error %s\n", src);
}
}
int main(void) {
int res;
char *endptr;
const char *strA = "A";
const char *str0 = "0";
const char *str1 = "1";
funcStrtol(strA);
funcStrtol(str0);
funcStrtol(str1);
return 0;
}
結果
Error A
0
1
戻り値
変換が不可能な場合: 0
変換が不可能な場合に0の戻り値となるが、"0"を変換したときとかぶる、というのが始まりの疑問だった。
try2
src と endptrのチェックでもよさそう。
void funcStrtol(char *src)
{
int res;
char *endptr;
res = strtol(src, &endptr, 0);
// if (strcmp(src, endptr) != 0) {
if (src != endptr) {
printf("%d %s\n", res, endptr);
} else {
printf("Error %s\n", src);
}
}