尝试在 C 中创建一个函数,该函数接受用户输入并返回一串 char



无论我尝试什么,我都会得到一个错误。我将删除指针,删除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;
}

代码中有许多错误。

第一个是getResources((函数的返回值。您返回的是 (*str( 指向的值,这是一个字符,但您希望返回整个数组。 要修复它,您应该编写返回 str

第二个是在sizeof((运算符中,它是一个编译时运算符。由于它是在编译时执行的,因此它现在不是运行时 char 数组 malloc-ed 的大小,而只是指针本身的大小。 因此,您不能以这种方式使用它,但您必须将其替换为数组的实际大小。

第三个是函数顺序。不能使用以前未声明的函数。您可以将完整的函数移到 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而不是指针str

return str;

此外,您正在读取sizeof(str)字符,即指针的大小,可能因平台而异。 因此,您需要将其更改为3,即分配给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("%sn", c);
return 0;
}

最新更新