使用sscanf()忽略字符旁边的整数

ARW*_*ARW 5 c

很抱歉这个简单的问题,但我正试图找到一种优雅的方法来避免我的程序看到像"14asdf"这样的输入并接受它为14.

if (sscanf(sInput, "%d", &iAssignmentMarks[0]) != 0)
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以防止sscanf将整数从那些错误的字符串中拉出来?

Jon*_*ler 3

您不能直接停止sscanf()执行其设计和指定的操作。但是,您可以使用 的一个鲜为人知且很少使用的功能sscanf()来轻松发现问题:

int i;

if (sscanf(sInput, "%d%n", &iAssignmentMarks[0], &i) != 1)
    ...failed to recognize an integer...
else if (!isspace(sInput[i]) && sInput[i] != '\0')
    ...character after integer was not a space character (including newline) or EOS...
Run Code Online (Sandbox Code Playgroud)

%n指令报告截至该点消耗的字符数,并且不计为一次转换(因此该格式只有一次转换)。这%n是自 C89 以来的标准sscanf()

为了提取单个整数,您还可以小心地使用- (用它检测错误条件非常困难,但它比不报告或检测溢出strtol()要好)。sscanf()然而,这种技术可以以单一格式多次使用,这通常更方便。