特殊的sscanf用法

时间:2015-02-19 14:00:46

标签: c scanf

我使用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以满足上述条件?

4 个答案:

答案 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,那好吗?