动态字符串输入 - 使用scanf("%as")

9

我正在尝试使用 scanf 读取输入并将其存储到 char * 中,根据GCC手册的规定动态分配内存,但它会在编译时出现错误。

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

10

a修饰符在使用scanf时,若编译时加上-std=c99标志,则无法起作用;请确保未使用该标志。

如果您的glibc版本至少为2.7,则应该使用m修饰符代替a

此外,您需要负责释放缓冲区。


使用“-ansi”或“--std=c98”编译可以与scanf("%as")一起使用。 - N 1.1
2
关于m标志的一些背景信息,因为GCC/glibc文档没有提到它:http://gcc.gnu.org/ml/gcc-patches/2007-09/msg01342.html - Michael Burr
1
要使用a修饰符,请将-D_GNU_SOURCE传递给gcc,但最好使用m - user339222
令人困惑的是,在定义了_GNU_SOURCE(在任何#include之前)的情况下,使用-std=gnu99的gcc 4.9.2会发出警告,指出%a需要一个float *,但您正在传递一个char **。但是行为与%m [匹配。我花了一段时间才记得%a是动态分配转换,因为手册中没有在其他修饰符附近提到旧的GNU含义。即使是新的POSIX.1-2008%ms / %m [也只在带有字段宽度内容的密集段落中提到。真的很容易错过。 :/ - Peter Cordes

1
你启用了GNU扩展吗?标准C根本没有a修饰符。

1
使用scanf("%as")的“动态字符串输入”将在启用-ansi-std=c89标志时工作。
使用gcc -ansi进行编译。
否则,您可以使用scanf("%ms")

0

我在使用GCC方面经验有限,但我从未见过%a修改符号用于scanf。你可以尝试将你提供的第三行中的%a替换为%s


请参考提供的链接。FYI,%c仅存储1个字符。我正在尝试动态分配内存来存储完整的0-9a-zA-Z字符字符串。 - N 1.1
我知道%c的作用 - 我只是错过了那一点。当你使用%s而不是%a时会发生什么? - user65628
2
如果您已经分配了内存,%s 将起作用。 而 %as(带有标志)会自行分配所需的内存给 *variable,稍后可以使用 freed() 释放。 - N 1.1
@nvl - 我不知道这个。谢谢你提供的信息 :) - user65628

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接