我正在尝试创建一个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);
}
但它没有编译。 请问你能告诉我我做错了什么,以及我能做得更好吗?
答案 0 :(得分:2)
第一件事:
在您的代码中,
while(ch != '\n')
调用undefined behavior,因为ch
是一个自动局部变量,除非明确初始化,否则它包含一个不确定的值。试图读取不确定的值是UB。
第二件事,
free(tmpstring);
在return
语句完全没有效果之后。只需删除它。
第三件事:
Please see this discussion on why not to cast the return value of malloc()
and family in C
.
第四件事:
根据您的return
语句,函数返回类型应为char *
,而不是char
。
最后
但它没有编译
无法以当前形式回答。您需要在问题中提供更多信息以澄清"什么"和"如何"。
答案 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;
}
(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
表示在函数结束后不会销毁它。虽然我有时会在标准库中看到这种东西,但我不推荐它,因为当再次调用该函数时内容将被删除。
对于其他问题,请参阅之前的答案。