我使用sscanf将3个char字符串读取/解析为int:
char strId[4] = "123";
int i;
int count = sscanf(strId, "%i" &i);
我正在测试count==1
以检查解析是否成功或失败
"123"
正确成功 - 我想将此视为一个数字
"aaa"
无法正确使用 - 我不想将此视为一个数字
但
"2aa"
成功(计数== 1,i == 2) - 但我想将此视为失败,因为我不想将此视为一个数字。
如何简单地解析strId以满足上述条件?
答案 0 :(得分:2)
使用strtol(3)
。它允许指定"解析结束"指针(endptr
下方)。转换完成后,您可以检查它是否指向字符串的末尾。如果没有,则输入中会留下非数字字符。
long strtol(const char *restrict str, char **restrict endptr, int base);
来自man strtol
:
如果endptr不为NULL,则strtol()存储第一个地址 * endptr中的无效字符。如果根本没有数字, 但是,strtol()将str的原始值存储在* endptr中。 (从而, 如果* str不是' \ 0'但是** endptr是' \ 0'返回时,整个字符串 是有效的。)
答案 1 :(得分:2)
采用sscanf()
方法,使用"%n"
。
"%n"
保存扫描停止的位置。
char strId[4] = "123";
int n = 0
sscanf(strId, "%i %n" &i, &n);
if (n == 0 || strId[n] != '\0') Handle_ProblemInput(strId);
这将通过:"123"
," 123"
,"123 "
并且失败:"123a"
,""
," abc"
可能/可能无法检测到int
溢出"12345678901234567890"
。
[编辑]
"%n"
的好处在于它可以用于复杂的格式和格式,否则以固定文本结尾。 IOWs,只是检测扫描是否一直到'\0'
?
int n = 0;
sscanf(buf, " %i %f %7s ,,, %c blah foo %n", ...);
if (n == 0 || buf[n] != '\0') Handle_ProblemInput(buf);
答案 2 :(得分:1)
使用strtol
这是一项简单的任务,只需执行此操作
#include <stdio.h>
#include <stdlib.h>
char string[] = "123xyz";
char *endptr;
int value;
value = strtol(string, &endptr, 10);
if ((*string != '\0') && (*endptr == '\0'))
printf("%s is a number and has no unconvertible characters", string);
/* and now 'value' contains the integer value. */
如果你想使用sscanf()
,那么这也应该这样做
#include <stdio.h>
#include <string.h>
char string[] = "123";
int count;
int value;
int length;
length = strlen(string);
if ((sscanf(string, "%d%n", &value, &count) == 1) && (count == length))
printf("%s is a number and has no unconvertible characters", string);
/* and now 'value' contains the integer value. */
答案 3 :(得分:0)
char str[255];
int count = sscanf((const char*)strId, "%i%254s", &i, str);
如果它带回count == 1
,那好吗?