sscanf未转换的字段不受影响?

时间:2015-10-14 13:58:17

标签: c scanf

如果sscanf必须转换字段,并且失败,字段的相应变量是否会保持不受影响?在我发布的最新解决方案的评论中提出了这个问题:

int validate(int low, int high) {
int s=0;
char buf[128];

    do {
        if (fgets(buf,128,stdin)==0 || sscanf(buf, "%d", &s)!=1 || (s<low || s>high))
            printf("invalid Input, try again:");
    } while (s<low || s>high);
    return s;
}

在此示例中,s初始化为零,并假设它保持为零,而sscanf无法从输入转换整数值。这会导致在输入无效输入时退出循环(假设low大于零)。

从VC2008文档&#34; sscanf ...返回成功转换并分配的字段数&#34;这似乎暗示它在内部转换输入,并在成功转换后执行赋值。如果s无法转换输入,则反过来意味着sscanf不会受到影响。

1 个答案:

答案 0 :(得分:1)

  

如果sscanf必须转化某个字段,并且该字段失败,该字段的相应变量是否会保持不受影响?

标准没有明确说明,但它似乎遵循scanf()函数族的行为的逐步描述。特别是:

  

除了%说明符的情况外,输入项[...]将转换为适合转换说明符的类型。如果输入项不是匹配序列,则指令的执行失败:此条件是匹配失败。除非*指示赋值抑制,否则转换的结果将放置在尚未收到转换结果的format参数后面的第一个参数所指向的对象中。

我认为很难解释除了首先转换输入,然后,如果转换成功,它被分配。因此,如果转换失败,则不会修改指向对象(通过 转换说明符 - 如果参数重复或者它们彼此别名,它可能已被先前的修改过)。

因此,我认为您的代码应该按照您的预期行事。