,所以我想将input
从用户获取到我的string
并打印出来:
char *fname ;
getname(fname);
printf("%s", &fname);
void getname(char *fnam e)
{
fname = (char *)malloc(30);
gets(fname);
}
所以我有错误:
非初始化的本地变量'fname'
编辑:
我只有此代码,并且在此代码上看到了什么问题,不要使用不同的方法。
c按值传递。因此,fname
没有任何变化。要进行更改,您必须通过地址。
getname(&fname);
,然后
#define LEN 30
void getname(char **fname)
{
*fname = malloc(LEN);
if((*fname) == NULL ){ perror("malloc"); exit(1);}
if(fgets(*fname,LEN,stdin)==NULL){
fpritnf(stderr,"Error in input");
exit(1);
}
}
和在这种情况下的printf
用法将为
printf("%s", fname);
不要使用 gets
弃用。并在使用它的情况下释放动态分配的内存。
在main()
char *fname ;
getname(&fname);
printf("%s", fname);
free(fname);
也不需要施放malloc
,因为void*
转换为char*
转换是隐式完成的。
不要使用'get',它已弃用。" fname"是指向单位化内存的指针。使用此:
char *fname = malloc(30);
getname(fname);
printf("%s", fname);
void getname(char *fname)
{
fgets(fname, 30, stdin);
}
您需要具有main()
功能。C不会执行不在函数内部的随机代码。尝试将其重写看起来像这样:
void getname(char *fname)
{
fname = (char *)malloc(30);
gets(fname);
}
int main(void){
char* fname;
getname(fname);
puts(fname);
}
好吧,现在我们可以分析它。发生的事情是,当您将指针(或任何变量(传递给函数时,指针会复制。当您执行fname = malloc(30);
时,函数中的fname
从malloc
设置为指针,但是MAIN中的原始fname
保持不变。因此,当getname
返回main
时,fname
仍未实现。
您想做的是在MAIN中分配fname
,要么从getname
返回指针。因此,这样的事情将有效:
void getname(char *fname)
{
gets(fname);
}
int main(void){
char* fname = malloc(30); // OR
char fname2[30];
getname(fname);
puts(fname);
}
也会这样:
char* getname(void)
{
fname = (char *)malloc(30);
gets(fname);
return fname;
}
int main(void){
char* fname = getname();
puts(fname);
}