我正在使用scanf来提取非常规则的表格数据。我需要在两遍中重复它,并且可以在某些时候安全地忽略一些参数。 我想为我关心的字符串分配空间,为其他字符串分配一个“discard”字符串。如果我多次传递此参数作为输出,是否定义了行为?
一个愚蠢的最小例子:
char label[MAX_SIZE], discard[MAX_SIZE];
sscanf(input, "%s %s %s %s", discard, label, discard, discard);
答案 0 :(得分:8)
我在C11标准中找不到任何使您的预期用途无效的语言。
但似乎有更好的解决方案。如果在格式字符串中的*
之后放置%
(“赋值抑制字符”),则scanf
函数将解析但不存储输入项。因此,您不必(实际上)必须为其提供目标参数。似乎正是你在这里所需要的。
答案 1 :(得分:6)
如果我多次传递此参数作为输出,是否定义了行为?
引用C11:
7.21.6.2 fscanf函数
int fscanf(FILE * restrict stream,
const char * restrict format, ...);
- fscanf函数依次执行格式的每个指令。当所有指令都已执行,或者指令失败时(如下所述),函数返回。
醇>
fscanf
函数(以及sscanf
)依次执行格式的每个指令,因此分配给discard
参数时应该没有问题时间,因为最终作业将产生最终效果(覆盖之前的作业)。