使用sscanf进行正则表达式

时间:2013-07-01 04:08:29

标签: c regex scanf

我有一个字符串str,如果str由纯数字组成,则将数字提取到int,如果不是,则不提取任何内容或仅提取0。

例如,

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

我可以使用sscanf吗?怎么样?

4 个答案:

答案 0 :(得分:2)

int  value;
char unused;
if (1 == sscanf(myString, "%d%c", &value, &unused))
{
    // success
}
else
{
    // bad input
}

答案 1 :(得分: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

答案 2 :(得分:0)

有几件事需要考虑:

  1. 应该只接受数字还是否定值?

  2. 是否应该检查越界值?

  3. 这将执行大量的验证和范围检查:

    #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
    }
    

答案 3 :(得分: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
 }