char *userinput(void){
char input[22];
fgets(input,22,stdin);
char *inputpoint;
inputpoint=input;
return inputpoint;
}
此函数应该只是简单地接收用户输入字符串并将其返回。 我在main中调用函数如下
float arrests;
float money;
//print menu
menuprint();
//Take first User input
char *inputpoint;
inputpoint=userinput();
char input[22];
input=inputpoint;
printf("\nYou entered: %s\n",input);
return 0;
}
我对编码尤其是指针相对较新。我不知道为什么这段代码没有输出输入的字符串。请帮忙
答案 0 :(得分:1)
你还没有说明你遇到的实际问题,但在这种情况下它很清楚。如果您在编译器上启用了警告,它应该告诉您正在返回本地变量的地址。这是未定义的行为,并且您不允许这样做。
这里有两种常见的方法。一种是通过将其作为函数参数传递来提供位置:
void userinput( char input[22] )
{
fgets(input, 22, stdin);
}
另一种是动态分配。在这种情况下,您可以按原样声明您的功能,但是执行malloc
,或只使用strdup
:
char *userinput(void)
{
char input[22];
fgets(input, 22, stdin);
return strdup(input);
}
请注意,如果您使用动态内存,则需要在完成后清理它:
char *inputpoint = userinput();
printf("\nYou entered: %s\n", inputpoint);
free(inputpoint);
现在我注意到另一个问题:
input = inputpoint;
以上是指定一个数组的指针。这不合法,您的编译器应该发出错误。显然你想要复制字符串。您可以使用strncpy
:
strncpy( input, inputpoint, 22 );
答案 1 :(得分:0)
我在这里看到很多错误。
看来你还没有声明输入点。还是在其他地方宣布?
另外,为什么你这样做你的阅读输入。对于如此简单的任务来说似乎太复杂了。请参阅下面的此解决方案及其下方的讨论。
void read(char *out){
scanf("%22s",&out[0]);
printf("%s\n", out);
}
int main(void) {
char chars2[22];
read(chars2);
printf("%s\n", chars2);
return 0
}
您的解决方案的核心问题是C函数无法返回数组,这与许多其他语言(如Java)不同。所以我们必须变得更有创意。我们可以做的是将read方法的内存引用传递给我们想要通过参数更新的值。
& (地址)运算符允许scanf访问第一个数组元素的内存位置,这样它就可以用输入的内容填充数组。输入的最大长度为22个字符以匹配char数组。因此,如果输入更多则忽略22之后的任何内容。
答案 2 :(得分:0)
基本问题是你要返回一个指向局部变量的指针。当userinput
返回时,它的堆栈帧被释放以被下一个名为(printf
)的函数重用,但指针仍指向它,因此您打印垃圾或崩溃。