1

我有一个字符串str,如果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

纯数字使用 sscanf()
" %n"检测前导空白。
"%d"扫描int.
"%c"测试尾随字符。

int PureDigits(const char *s) {
   int y;
   char extra;
   int n;
   if ((1 == sscanf(s, " %n%d%c", &n, &y, &extra)) && (n == 0)) {
     return y; // success
     }
   return 0; // failed
 }
于 2013-08-08T23:29:29.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 回答