C:sscanf赋值抑制和返回值

时间:2012-04-14 04:22:20

标签: c scanf

我正在尝试在C中使用sscanf从字符串中获取一些值。但是,如果字符串的值多于我想要的值,我需要它来抛出错误。即。如果我想要一个整数,“2”应该没问题,但“2 5”应该崩溃。

现在在sscanf上使用返回值,如下所示:

if (sscanf(mystring, "%d %*s", &num) == 1)

不起作用,因为即使字符串较长,它也会返回1。我可以这样做:

char tmpString [100];
if (sscanf(mystring, "%d %s", &num, tmpString) == 1)

工作正常,但不是特别好。还有另外一种方法吗?我可以使用赋值抑制并仍然获得我想要的返回值吗?

编辑 这是我用过的代码:

char c; // This is a global variable, just gets used over and over.
sscanf(mystring, "%d%c", &num, &c);
    if (c == '\n') {

2 个答案:

答案 0 :(得分:1)

一种可能性是:

int pos;
if (sscanf(mystring, "%d %n", &num, &pos) == 1)
{
    if (mystring[pos] != '\0')
        ...oops...extra data...
    else
        ...only number...
}
else
    ...not even one number...

%n是C89的一部分。它不是特别常用的(或广为人知的)转换规范。它不会被计为转换(因此是1的测试)。

答案 1 :(得分:0)

一个更简单的测试,只使用 scanf 返回值而不是一个返回值和一个字符数的测试,可以使用:

if (1 == sscanf(mystring, "%d %c", &num, &(char){0}))

这是可行的,因为如果在尾随空格被消耗后有任何字符,则会执行第二次赋值,因此返回值是 2 而不是 1。

(char){0} 是一个复合字面量,它提供一个临时对象来保存分配的 char,之后它被丢弃。)