我正在尝试使用 scanf
读取输入并将其存储到 char *
中,根据GCC手册的规定动态分配内存,但它会在编译时出现错误。
char *string;
if (scanf ("%as",&string) != 1){
//some code
}
else{
printf("%s\n", *string);
free(string);
//some code
}
我正在尝试使用 scanf
读取输入并将其存储到 char *
中,根据GCC手册的规定动态分配内存,但它会在编译时出现错误。
char *string;
if (scanf ("%as",&string) != 1){
//some code
}
else{
printf("%s\n", *string);
free(string);
//some code
}
a
修饰符在使用scanf时,若编译时加上-std=c99
标志,则无法起作用;请确保未使用该标志。
如果您的glibc版本至少为2.7,则应该使用m
修饰符代替a
。
此外,您需要负责释放缓冲区。
a
修饰符。scanf("%as")
的“动态字符串输入”将在启用-ansi
或-std=c89
标志时工作。gcc -ansi
进行编译。scanf("%ms")
。我在使用GCC方面经验有限,但我从未见过%a
修改符号用于scanf
。你可以尝试将你提供的第三行中的%a
替换为%s
。
%c
的作用 - 我只是错过了那一点。当你使用%s
而不是%a
时会发生什么? - user65628
m
标志的一些背景信息,因为GCC/glibc文档没有提到它:http://gcc.gnu.org/ml/gcc-patches/2007-09/msg01342.html - Michael Burra
修饰符,请将-D_GNU_SOURCE传递给gcc,但最好使用m
。 - user339222#include
之前)的情况下,使用-std=gnu99
的gcc 4.9.2会发出警告,指出%a
需要一个float *
,但您正在传递一个char **
。但是行为与%m [
匹配。我花了一段时间才记得%a
是动态分配转换,因为手册中没有在其他修饰符附近提到旧的GNU含义。即使是新的POSIX.1-2008%ms
/%m [
也只在带有字段宽度内容的密集段落中提到。真的很容易错过。 :/ - Peter Cordes