scanf动态分配

时间:2012-08-13 00:16:47

标签: c string dynamic input

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

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

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

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

其他信息:

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

5 个答案:

答案 0 :(得分:9)

我在Draft C11 standard%m部分)第7.21.6.2节中没有看到fscanf。我建议您避免使用它,并像在C99中那样拨打malloc()

答案 1 :(得分:1)

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

答案 2 :(得分: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);

希望它有所帮助!

答案 3 :(得分:0)

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

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

我读过'man scanf',它说:

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

答案 4 :(得分:0)

手册页中有一个scanf / sscanf(第3页,从270-290行开始)的示例,其内容如下:

示例

要使用动态分配转换说明符,请将m指定为长度修饰符(因此%ms或%m [range])。调用者必须释放(3)返回的字符串,如以下示例所示:

char *p;
int n;

errno = 0;
n = scanf("%m[a-z]", &p);
if (n == 1) {
   printf("read: %s\n", p);
   free(p);
} else if (errno != 0) {
   perror("scanf");
} else {
   fprintf(stderr, "No matching characters\n");
}

如上面的示例所示,只有在scanf()调用成功读取字符串之后,才需要调用free(3)。

来源:SCANF(3)-Linux程序员手册-GNU-2013-01-30