【问题标题】:Are scanf arguments allowed to alias? [duplicate]scanf 参数是否允许别名? [复制]
【发布时间】:2017-01-06 03:41:11
【问题描述】:

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

一个愚蠢的小例子:

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

【问题讨论】:

  • scanf() 内的赋值是按顺序完成的,应该没有问题。
  • 你为什么不使用赋值抑制操作符sscanf(input, "%*s %s %*s %*s", label);
  • 因为我实际上是在将参数传递给一个在完成其他工作后提取字段的函数,所以有时我只想忽略这些字段。
  • @DavidC.Rankin 使用*的原因是处理sscanf()的返回值,以注意input的哪一部分被分配给@987654327 @ 在扫描不完整的情况下。 IOW,扫描成功了多少。
  • @DavidC.Rankin 我将其投票为受骗者,但不希望受骗者锤子,因为我希望需要额外的投票来同意或不同意。如果您认为合适,请投票重新开放。这似乎是标题问题的欺骗,但不是帖子正文的欺骗。

标签: c scanf


【解决方案1】:

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

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

【讨论】:

  • 有趣的是,像 C 这样简单的东西仍然可以隐藏我的东西。
  • @GradyPlayer 虽然我发现 C 编程语言简单而优雅,但 scanf 函数却是一个复杂的野兽。这么多,我尽可能避免它。
  • 在这种情况下,我有一个提取它的函数,并且有时我想要这些字段。我可能最终会像你建议的那样做一些事情,并在以后对其进行特殊处理。这更像是一种好奇心。
  • @5gon12eder,是的,除了尝试重现人们在 SO 上遇到的问题之外,我可能从未真正使用过 scanf 函数,等等......如果我正在从文件中读取结构化数据,我当然没有使用 fscanf ......我可以恳求 scanf 无知......
【解决方案2】:

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

引用 C11:

7.21.6.2 fscanf 函数

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

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

【讨论】:

    猜你喜欢
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 2017-06-30
    相关资源
    最近更新 更多