C语言:读取函数内部用户的输入 - 这段代码有什么不对

时间:2018-02-06 18:15:07

标签: c

所以我想让用户input进入我的string并打印出来:

char *fname ;
getname(fname);
printf("%s", &fname);

void getname(char *fnam e)
{
    fname = (char *)malloc(30);
    gets(fname);
}

所以我有错误:

  

未初始化的本地变量'fname'

编辑:

我只有这段代码,看看这段代码有什么不对,不要用不同的方法。

3 个答案:

答案 0 :(得分:4)

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*转换是隐式完成的。

答案 1 :(得分:1)

不要使用'获取'它已被弃用。 ' FNAME'是指向单位化内存的指针。使用此:

char *fname = malloc(30);
getname(fname);
printf("%s", fname);

void getname(char *fname)
{
    fgets(fname, 30, stdin);
}

答案 2 :(得分:0)

您需要拥有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);
}