str
純粋な数字で構成されている場合はstring がありstr
、数字を に抽出しint
、そうでない場合は何も抽出しないか、単に 0 を抽出します。
例えば、
str = "12345"; // composed of pure digits, extract 12345
str = "123abc"; // not pure digits, extract nothing or 0
を使用して実行できますsscanf
か? どのように?
int value;
char unused;
if (1 == sscanf(myString, "%d%c", &value, &unused))
{
// success
}
else
{
// bad input
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int only_int(const char *s, int *v) {
char buf[256];
*v = 0;
if (sscanf(s, "%[0-9]", buf) && strlen(buf) == strlen(s)) {
*v = atoi(buf);
return 0;
}
return -1;
}
int main() {
char str1[] = "12345", str2[] = "123abc";
int i, r;
r = only_int(str1, &i); printf("%d, %d\n", r, i);
r = only_int(str2, &i); printf("%d, %d\n", r, i);
return 0;
}
出力:
0, 12345
-1, 0
考慮すべき点がいくつかあります。
数字のみを受け入れるべきですか、それとも負の値は問題ありませんか?
範囲外の値をチェックする必要がありますか?
これにより、適切な量の検証と範囲チェックが実行されます。
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
unsigned long parse_num(const char* str)
{
char *endptr = NULL;
long result;
if (strspn(str, "0123456789") != strlen(str)) {
return 0;
}
errno = 0;
result = strtoul(str, &endptr, 10);
if (errno == ERANGE || *endptr) {
return 0;
}
return result;
}
int main(void)
{
printf("%lu\n", parse_num("12345")); // 12345
printf("%lu\n", parse_num("123abc")); // 0
printf("%lu\n", parse_num("-123")); // 0
printf("%lu\n", parse_num("1231111111111111111111111111111123123131")); // 0
printf("%lu\n", parse_num("0123")); // 123
}