函数调用C中的指针有问题

时间:2014-01-29 23:08:56

标签: c arrays string function pointers

 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;
}

我对编码尤其是指针相对较新。我不知道为什么这段代码没有输出输入的字符串。请帮忙

3 个答案:

答案 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)的函数重用,但指针仍指向它,因此您打印垃圾或崩溃。