scanf参数是否允许别名?

时间:2017-01-06 03:41:12

标签: c scanf

我正在使用scanf来提取非常规则的表格数据。我需要在两遍中重复它,并且可以在某些时候安全地忽略一些参数。 我想为我关心的字符串分配空间,为其他字符串分配一个“discard”字符串。如果我多次传递此参数作为输出,是否定义了行为?

一个愚蠢的最小例子:

char label[MAX_SIZE], discard[MAX_SIZE];
sscanf(input, "%s %s %s %s", discard, label, discard, discard);

2 个答案:

答案 0 :(得分:8)

我在C11标准中找不到任何使您的预期用途无效的语言。

但似乎有更好的解决方案。如果在格式字符串中的*之后放置%(“赋值抑制字符”),则scanf函数将解析但不存储输入项。因此,您不必(实际上)必须为其提供目标参数。似乎正是你在这里所需要的。

答案 1 :(得分:6)

  

如果我多次传递此参数作为输出,是否定义了行为?

引用C11:

  

7.21.6.2 fscanf函数

     int fscanf(FILE * restrict stream,
          const char * restrict format, ...);
  
      
  1. fscanf函数依次执行格式的每个指令。当所有指令都已执行,或者指令失败时(如下所述),函数返回。
  2.   

fscanf函数(以及sscanf)依次执行格式的每个指令,因此分配给discard参数时应该没有问题时间,因为最终作业将产生最终效果(覆盖之前的作业)。