失败的C函数接受用户字符串数组输入

时间:2015-12-21 11:22:20

标签: c string pointers gcc

我正在尝试创建一个C函数,我可以在我编写的小程序中调用,以接受用户输入:

char GetStringMine()
{
    int i = 0;
    char ch;
    char * tmpstring = (char *) malloc(2048 * sizeof(char));
    while(ch != '\n')
    {
        ch = getchar();
        tmpstring[i++] = ch;
    }
    tmpstring[i] = '\0';
    return * tmpstring;
    free(tmpstring);
}

但它没有编译。 请问你能告诉我我做错了什么,以及我能做得更好吗?

4 个答案:

答案 0 :(得分:2)

最后

  

但它没有编译

无法以当前形式回答。您需要在问题中提供更多信息以澄清"什么"和"如何"。

答案 1 :(得分:0)

试试这个......

static char tmpstring[2048] = {0};

char* GetStringMine()
{
    int i = 0;
    char ch = 0;

    while(ch != '\n')
    {
        ch = getchar();
        tmpstring[i++] = ch;
    }

    return tmpstring;  
}
  • 您无法释放已分配的内存然后返回指向它的指针,数据将消失
  • 不需要使用malloc,因为您没有动态分配数组(1)
  • 返回char *,而不是char

(1)在您的示例中,您有效地将内存大小修改为2048.考虑防止缓冲区溢出 - 如果用户输入超过2048个字符会发生什么,以及如何保护您的代码不受此影响。 在实际应用程序中,如果超过分配的大小,则需要重新分配,或者限制分配的内存的输入量。

答案 2 :(得分:0)

您正在尝试返回char指针(char *),但返回类型是char。你也应该考虑其他评论。

char* GetStringMine()
{
    int i = 0;
    char ch;
    char * tmpstring = (char *) malloc(2048 * sizeof(char));
    while(ch != '\n')
    {
        ch = getchar();
        tmpstring[i++] = ch;
    }
    tmpstring[i] = '\0';
    return  tmpstring;
}

答案 3 :(得分:0)

这段代码最糟糕的是你正在尝试返回一个指向本地变量的指针。在您的函数执行完成后,变量tmpstring将被销毁(即。return语句中)。

要解决此问题,您应该将char*作为参数,并将读取的字符存储在其中(如果您使用此解决方案,请小心溢出)。

或者,您可以将tmpstring声明为static char tmpstring[2048] = {0};static表示在函数结束后不会销毁它。虽然我有时会在标准库中看到这种东西,但我不推荐它,因为当再次调用该函数时内容将被删除。

对于其他问题,请参阅之前的答案。