我有一个字符串str
,如果str
由纯数字组成,则将数字提取到int
,如果不是,则不提取任何内容或仅提取0。
例如,
str = "12345"; // composed of pure digits, extract 12345
str = "123abc"; // not pure digits, extract nothing or 0
我可以使用sscanf
吗?怎么样?
答案 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)
有几件事需要考虑:
应该只接受数字还是否定值?
是否应该检查越界值?
这将执行大量的验证和范围检查:
#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
}