无论出于何种原因,以下代码都会打印(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标准进行编译
答案 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