【发布时间】:2018-06-02 06:18:34
【问题描述】:
我正在编写一个代码,它接受用户想要的长度字符串并显示它。所以这就是我写的
#include<stdio.h>
#include<stdlib.h>
void main()
{
char *a;
int i,n;
a=(char*)calloc(1,sizeof(char));
printf("enter the string\t");
for(i=0;a[i]!=0;i++)
{
scanf("%[^0]c",&a[i]);
n=2+i;
a=(char*)realloc(a,(n)*sizeof(char));
}
for(i=0;a[i]!=0;i++)
{
printf("%c",a[i]);
}
free(a);
a=NULL;
}
但它没有进入循环并接受任何输入。你能告诉我出了什么问题吗?谢谢
【问题讨论】:
-
为什么要逐个字符地打印,而不是将其放入以 NULL 结尾的字符串缓冲区,然后直接将其提供给
printf?虽然free(a)是可以理解的,但将a设置为NULL真的毫无意义。 -
通常你会通过分配一个乐观的大缓冲区来解决这个问题,如果用户超过这个大小,重新分配两倍的大小。这避免了无情的重新分配。
-
scanf("%[^0]c",&a[i])不是有效格式。我建议您使用fgets并以 100 字节的步长重新分配,然后重复直到在输入字符串的末尾检测到'\n'换行符。请注意,'\0'不会终止输入字符串,而只会终止 C 字符串。 -
@WeatherVane
scanf("%[^0]c",&a[i])是一种有效的格式,但肯定不是 OP 想要的。
标签: c string dynamic-memory-allocation