scanf动态分配

无论出于何种原因,以下代码打印(null):

#include  #include  int main(void) { char *foo; scanf("%ms", &foo); printf("%s", foo); free(foo); } 

我正在尝试动态地为字符串分配内存,但正如我之前所说,我的程序只是输出(null)。 我通过使用getche和realloc创建一个函数来解决这个问题,但是由于我还必须编写用户输入退格键,制表符等所会发生的事情,这似乎几乎毫无意义。但正如我所说的那只是一项工作周围,​​我宁愿知道为什么上面的代码不起作用…

附加信息:

我正在使用Pelles C IDE v7.00并使用C11标准进行编译

我没有在C11标准草案 (关于fscanf的部分)的第7.21.6.2节中看到%m 。 我建议你避免它并像在C99中那样调用malloc()

%m是GNU扩展,这可能是它在Pelles C中不可用的原因。

我正在使用Linux 3.2.0 amd 64和gcc 4.7.2 。 使用代码:

 char *s; scanf("%ms", &s); printf("%s", s); free(s); 

工作正常,但不接受空格。

对于静态分配,您可以改为使用:

 char s[100]; printf("Enter string (max 99 characters): "); scanf("%100[^\n]s", &s); printf("You entered: %s\n", s); 

希望能帮助到你!

正如Arun所说,这个解决方案是正确的,而Meninx的观点是错误的:

 char *s; scanf("%ms", &s); printf("%s", s); free(s); 

我读过’man scanf’,它说:

一个可选的’m’字符。 这用于字符串转换(%s,%c,%[),
并且释放调用者需要分配相应的缓冲区来保存输入:相反,scanf()分配一个足够大小的缓冲区,并将此缓冲区的地址分配给相应的指针参数,该参数应该是指向char的指针*变量 (在调用之前不需要初始化此变量)。 随后,当不再需要时,调用者应释放(3)此缓冲区。