【问题标题】:Dynamic String Input - using scanf("%as")动态字符串输入 - 使用 scanf("%as")
【发布时间】:2010-02-24 21:57:19
【问题描述】:

我正在尝试使用scanf 读取输入并将其存储到char * dynamically as specified by GCC manual,但它给出了编译时错误。

  char *string;
  if (scanf ("%as",&string) != 1){
    //some code
  }
  else{
   printf("%s\n", *string);
   free(string);
   //some code
  }

【问题讨论】:

    标签: c scanf


    【解决方案1】:

    如果您使用-std=c99 标志进行编译,scanfa 修饰符将不起作用;确保你没有使用它。

    如果您至少拥有 2.7 版的 glibc,则可以并且应该使用 m 修饰符代替 a

    此外,释放缓冲区是您的责任。

    【讨论】:

    • 使用 '-ansi' 或 '--std=c98' 编译适用于 scanf("%as")。
    • m 标志的一些背景,因为 GCC/glibc 文档没有提到它:gcc.gnu.org/ml/gcc-patches/2007-09/msg01342.html
    • 要使用 a 修饰符,将 -D_GNU_SOURCE 传递给 gcc,当然最好使用 m
    • 令人困惑的是,定义了 _GNU_SOURCE(在任何 #includes 之前的 .c 中),带有 -std=gnu99 的 gcc 4.9.2 警告 %a 想要一个 float*,但你正在通过它是char **。但行为匹配%m[。我花了一段时间才想起 %a 是一个动态分配转换,因为手册页没有提到其他修饰符附近的旧 GNU 含义。即使是新的 POSIX.1-2008 %ms / %m[ 也只会在字段宽度内容的密集段落中提及。真的很容易错过。 ://
    【解决方案2】:

    您是否启用了 GNU 扩展?标准 C 根本没有 a 修饰符。

    【讨论】:

      【解决方案3】:

      如果启用了-ansi-std=c89 标志,则带有scanf("%as") 的“动态字符串输入”将起作用。
      使用gcc -ansi编译

      否则你可以使用scanf("%ms")

      【讨论】:

        【解决方案4】:

        我在 GCC 方面的经验有限,但我从未见过 %a 修饰符用于 scanf。您是否尝试过将您提供的第三行中的%a 替换为%s

        【讨论】:

        • 请参考提供的链接。仅供参考 %c 仅存储 1 个字符。我正在尝试动态分配内存以存储完整的 0-9a-zA-z 字符串。
        • 我知道%c 做了什么——我只是错过了那一点。当您使用 %s 而不是 %a 时会发生什么?
        • 如果您已经分配了内存,%s 将起作用。而 %as (带有标志)将所需的内存本身分配给 *variable ,以后可以释放()
        • @nvl - 我不知道。感谢您的信息:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-11
        • 1970-01-01
        • 2012-11-22
        相关资源
        最近更新 更多