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
。