C语言:从用户内部函数读取输入 - 此代码中有什么问题



,所以我想将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);时,函数中的fnamemalloc设置为指针,但是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);
}

最新更新