1

str純粋な数字で構成されている場合はstring がありstr、数字を に抽出しint、そうでない場合は何も抽出しないか、単に 0 を抽出します。

例えば、

str = "12345";  // composed of pure digits, extract 12345
str = "123abc";  // not pure digits, extract nothing or 0

を使用して実行できますsscanfか? どのように?

4

4 に答える 4

2
int  value;
char unused;
if (1 == sscanf(myString, "%d%c", &value, &unused))
{
    // success
}
else
{
    // bad input
}
于 2013-07-01T04:13:05.383 に答える
1
#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
于 2013-07-01T04:23:53.097 に答える
0

考慮すべき点がいくつかあります。

  1. 数字のみを受け入れるべきですか、それとも負の値は問題ありませんか?

  2. 範囲外の値をチェックする必要がありますか?

これにより、適切な量の検証と範囲チェックが実行されます。

#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
}
于 2013-07-01T06:14:32.613 に答える