Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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,不管我怎么做,我都会出错。我将删除指针,删除malloc,我尝试以不同的方式读取用户输入。我来自java背景,对为什么这些都不起作用感到非常困惑。另外,我并没有尝试返回字符串数组,我只是尝试返回一个字符串或c中的单个字符数组 main(){ char *c = getResources(); } char * getResources(){ char *str = (char *) malloc(sizeof(char) * 3); fgets

不管我怎么做,我都会出错。我将删除指针,删除malloc,我尝试以不同的方式读取用户输入。我来自java背景,对为什么这些都不起作用感到非常困惑。另外,我并没有尝试返回字符串数组,我只是尝试返回一个字符串或c中的单个字符数组

 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”等的正确长度。