尝试在c中创建一个函数,该函数接受用户输入并返回一个字符字符串
不管我怎么做,我都会出错。我将删除指针,删除malloc,我尝试以不同的方式读取用户输入。我来自java背景,对为什么这些都不起作用感到非常困惑。另外,我并没有尝试返回字符串数组,我只是尝试返回一个字符串或c中的单个字符数组尝试在c中创建一个函数,该函数接受用户输入并返回一个字符字符串,c,C,不管我怎么做,我都会出错。我将删除指针,删除malloc,我尝试以不同的方式读取用户输入。我来自java背景,对为什么这些都不起作用感到非常困惑。另外,我并没有尝试返回字符串数组,我只是尝试返回一个字符串或c中的单个字符数组 main(){ char *c = getResources(); } char * getResources(){ char *str = (char *) malloc(sizeof(char) * 3); fgets
main(){
char *c = getResources();
}
char * getResources(){
char *str = (char *) malloc(sizeof(char) * 3);
fgets(str, sizeof(str), stdin); /* read in a line */
return *str;
}
这里的问题是返回的是
*str
,而不是指针str
:
return str;
fgets(str, 3, stdin);
此外,您正在读取sizeof(str)
characters,它是指针的大小,可以在不同平台上变化。
因此,您需要将其更改为3
,即为str
分配的字符数:
return str;
fgets(str, 3, stdin);
这个解决方案可能是最糟糕的C代码之一,但它编译时没有警告。请务必阅读您对答案的所有评论,以及medalib和Andrea在答案中给出的信息。 我的代码只是把所有这些浓缩成一大块你可以复制粘贴的东西
#include <stdlib.h>
#include <stdio.h>
// define it before you use it; a prototype would also have worked
char* getResources(){
char *str = (char *) malloc(sizeof(char) * 3);
// second param is size of input to be expected;
// you passed it the size of a pointer, which is most
// definitely not what you want
fgets(str, 3, stdin); /* read in a line */
// return the pointer; str is already declared as a pointer,
// a further * will only de-reference that again
return str;
}
int main(){
char *c = getResources();
printf("%s\n", c);
return 0;
}
#包括
#包括
//在使用它之前定义它;原型也会起作用
char*getResources(){
char*str=(char*)malloc(sizeof(char)*3);
//第二个参数是预期输入的大小;
//您将指针大小传递给它,这是
//绝对不是你想要的
fgets(str,3,stdin);/*一行读取*/
//返回指针;str已声明为指针,
//进一步的*只会再次取消引用
返回str;
}
int main(){
char*c=getResources();
printf(“%s\n”,c);
返回0;
}
您的代码中有许多错误
第一个是getResources()函数的返回值。返回(*str)所指的值,该值是单个字符,但要返回整个数组。
要修复它,您应该编写returnstr
第二个是sizeof()操作符,它是一个编译时操作符。因为它是在编译时执行的,所以它现在不需要运行时malloc的char数组大小,而只需要指针本身的大小。
因此,不能以这种方式使用它,但必须用数组的实际大小替换它
第三个是功能顺序。您不能使用以前未声明的函数。您可以将完整函数移到main()上方,也可以将其声明在main()上方,并将实现留在后面
最后,main()函数应该返回一个整数
额外提示:当您不再需要malloc-ed指针时,不要忘记释放它
固定代码可能如下所示:
char * getResources(){
size_t str_size = 3;
char *str = malloc(str_size);
fgets(str, str_size, stdin); /* read in a line */
return str;
}
int main(){
char *c = getResources();
/* do something with c */
free(c);
return 0;
}
错误是什么?我想您只需要
返回str
。将return*str
更改为return str
。表单返回一个char
,而不是指向char
数组的指针。使用-Wall
重新编译以获得帮助。sizeof(str)
将获得指针的大小(在32位机器上通常为4,在64位机器上为8),而不是缓冲区的大小。这几乎总是会大于缓冲区的大小,只有3个字节。这会导致溢出,如果你幸运的话会崩溃,如果你不幸运的话会做更糟糕的事情。老实说,我建议你买一本关于C语言的好书,或者去上课。如果对基本原理没有深入了解,用C编写代码可能会导致灾难性的失败。千万不要从malloc
转换返回值。这是不必要的,它隐藏了编码错误。如果str\u size
的类型是size\u t
,sizeof(char)
根据定义是1
,用于用户输入的缓冲区大小为3
则更好。我根据您的建议更改了代码@用户输入的长度取决于预期的输入类型。例如,可能只需要国家代码就可以获得正确的资源,因此3是“it\0”、“en\n”、“fr\0”等的正确长度。