2012-08-13 130 views
6

无论出于何种原因,下面的代码打印(空):scanf函数动态分配

#include <stdio.h> 
#include <stdlib.h> 

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

我试图为动态字符串分配内存,但正如我刚才所说我的程序只是输出(空)。我通过使用getche和realloc来创建一个函数来解决这个问题,但是由于我还必须编程如果用户输入退格键,选项卡等等时会发生什么,所以它似乎几乎毫无意义。但正如我所说的,这只是一个工作周围,​​我宁愿知道为什么上面的代码是不工作...

附加信息:

我现在用的是PellesçIDE v7.00,并与C11标准编译

+0

'%ms'打算做什么? – 2012-08-13 00:18:44

+0

@Greg m标志应动态分配内存以包含输入。 – 2012-08-13 00:22:17

+3

这是不是标准?我没有在我的'scanf'文档中看到。 – 2012-08-13 00:23:17

回答

9

我不是见Draft C11 standard的第7.21.6.2节(fscanf部分)中的%m。我建议你避免它,并像在C99中一样呼叫malloc()

+2

由于您无法预测使用'scanf(“%s”)分配多少空间,我还建议完全避免使用'scanf'并使用'fgets'和'sscanf '。 – jamesdlin 2013-04-16 18:10:16

+4

''%ms' notation是['scanf()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/scanf.html)中的一个POSIX扩展,与标准的C版本' scanf()'。 – 2013-11-11 00:02:46

0

%m是GNU扩展,这可能是为什么它不提供Pelles C.

+4

这是一个POSIX扩展,而不仅仅是一个GNU扩展 – 2013-11-11 00:01:41

0

我使用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); 

希望它能帮助!

+0

对不起,但你不帮助他,因为如果你看看你的'scanf()'函数,你一定会意识到这是错误的!它应该是'scanf(“%ms”,s)',因为s本身就是一个指针!请谅解请注意,在's'之前没有'&'。另外请记住,如果有任何问题,它将不能用于程序中的下一个'scanf'!希望它是明确的! – 2015-01-18 14:31:31

+3

@Meninx:不,使用'%ms',它应该是'scanf(“%ms”,&s)'。 POSIX'm'扩展名为您分配字符串并将其分配给's',该''必须是'char *'类型。 – 2016-07-31 16:02:07

+1

@RudyVelthuis你是对的!感谢您指出! :) – 2016-07-31 16:10:59

0

Arun说,该解决方案是正确的,Meninx的观点是错误的:

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

我已经阅读了 '人scanf函数',它说:

一个可选的 'M' 字。这用于字符串转换(%s,%c,%[),
,并且减轻了调用者需要分配相应缓冲区到 保持输入:相反,scanf()分配足够大小的缓冲区,并且 这个缓冲器的地址分配给相应指针 论点,这应该是一个指向一个char *变量(此变量 不需要呼叫之前被初始化)。当这个缓冲区不再需要时,调用者应该随后释放(3)这个缓冲区。