scanf参数是否允许别名?

por*_*omp 8 c scanf

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

一个愚蠢的最小例子:

char label[MAX_SIZE], discard[MAX_SIZE];
sscanf(input, "%s %s %s %s", discard, label, discard, discard);
Run Code Online (Sandbox Code Playgroud)

5go*_*der 8

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

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


art*_*rtm 6

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

引用C11:

7.21.6.2 fscanf函数

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

fscanf功能(因此sscanf)执行格式的每个指令反过来,因此应该分配给没有问题discard多次参数,作为最终的分配将有最终的效果(覆盖以前的分配).