如果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
不会受到影响。
答案 0 :(得分:1)
如果
sscanf
必须转化某个字段,并且该字段失败,该字段的相应变量是否会保持不受影响?
标准没有明确说明,但它似乎遵循scanf()
函数族的行为的逐步描述。特别是:
除了
%
说明符的情况外,输入项[...]将转换为适合转换说明符的类型。如果输入项不是匹配序列,则指令的执行失败:此条件是匹配失败。除非*
指示赋值抑制,否则转换的结果将放置在尚未收到转换结果的format
参数后面的第一个参数所指向的对象中。
我认为很难解释除了首先转换输入,然后,如果转换成功,它被分配。因此,如果转换失败,则不会修改指向对象(通过 转换说明符 - 如果参数重复或者它们彼此别名,它可能已被先前的修改过)。
因此,我认为您的代码应该按照您的预期行事。