Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言:读取函数内部用户的输入-这段代码有什么问题_C - Fatal编程技术网

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

C语言:读取函数内部用户的输入-这段代码有什么问题,c,C,所以我想从用户那里获取输入,并将其打印到我的字符串中: char *fname ; getname(fname); printf("%s", &fname); void getname(char *fnam e) { fname = (char *)malloc(30); gets(fname); } 所以我有一个错误: 未初始化的局部变量“fname” 编辑: 我只有这段代码,看看这段代码有什么错误,不要使用不同的方法。C是按值传递的。因此,fname没有任何更改。

所以我想从用户那里获取
输入
,并将其打印到我的
字符串中:

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);
不要使用
get
它已被弃用。并在使用完后释放动态分配的内存

main()中


另外,不需要强制转换
malloc
,因为
void*
char*
的转换是隐式完成的。

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);
不要使用
get
它已被弃用。并在使用完后释放动态分配的内存

main()中


另外,不需要强制转换
malloc
,因为
void*
char*
的转换是隐式完成的。

不要使用“get”,这是不推荐的fname'是指向统一化内存的指针。使用以下命令:

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

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

不要使用“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);
}

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


即使他/她使用
fgets
这仍然不会初始化指针。即使他/她使用
fgets
这仍然不会初始化指针。
只有此代码,看看此代码有什么错误,不要使用不同的方法。
您对我们有什么期望?我无法回答您希望得到什么样的答案?请说得更准确些。30个字符似乎太短了,尤其是对于一个名字。想得更大些!请参见。
仅使用此代码,并查看此代码的错误,不要使用不同的方法。
您对我们的期望是什么?我无法确定答案您期望的是什么样的答案?请说得更准确些。30个字符似乎太短了,尤其是对于一个名字。想得更大些!参见。
fname=(char*)malloc(30)如果您正在更正答案,请正确执行。您应该以任何方式通知OP关于
获取
,更重要的是,这些答案都不会通知OP关于
免费
和关于
malloc
的演员阵容。第一个变体是完全不同的,就像问题中的代码一样。由于您仍然在使用
gets()
,这也被破坏了-请参阅
fname=(char*)malloc(30)如果您正在更正答案,请正确执行。您应该以任何方式通知OP关于
获取
,更重要的是,这些答案都不会通知OP关于
免费
和关于
malloc
的演员阵容。第一个变体是完全不同的,就像问题中的代码一样。由于您仍然在使用
gets()
,这也被破坏了-请看,我认为应该通知OP关于
free()
和关于铸造
malloc
@Michi.:谢谢.UP,谢谢你这么做:DOk但是为什么在getname函数中我需要写*fname=malloc(LEN);而不是fname=malloc(LEN)?因为fname已经是char*@DeanMovy。请检查
fname
的类型-它是
char**
-您将要更改包含地址的
char*
-
fname
。这就是为什么
*fname
。我认为应该通知OP关于
free()
和关于铸造
malloc
@Michi.:谢谢你这么做:DOk但是为什么在getname函数中我需要写*fname=malloc(LEN);而不是fname=malloc(LEN)?因为fname已经是char*@DeanMovy。请检查
fname
的类型-它是
char**
-您将要更改包含地址的
char*
-
fname
。这就是为什么
*fname