我有一个字符串str
,如果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
纯数字使用 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
}
有几点需要考虑:
应该只接受数字还是负值可以吗?
它应该检查超出范围的值吗?
这将执行相当数量的验证和范围检查:
#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
}