我正在编写一个程序,它从stdin返回一个字符串,但我收到警告,它返回一个本地wariable的地址。我该如何归还字符串?
提前致谢
#include <stdio.h>
char* readLine()
{
int i;
char input[1024];
for(i=0;i<1024;i++)
{
input[i]=fgetc(stdin);
if(input[i]=='\n')
{
break;
}
}
return input;
}
int main()
{
printf("%s",readLine());
return 0;
}
答案 0 :(得分:4)
这应该适合你:
您可以从main传递input
作为参考:
#include <stdio.h>
char * readLine(char * input, int length) {
int i;
for(i = 0; i < length; i++) {
input[i] = fgetc(stdin);
input[length] = '\0';
if(input[i] == '\n')
break;
}
return input;
}
int main() {
int length = 1024;
char input[length+1];
printf("%s", readLine(input, length));
return 0;
}
答案 1 :(得分:2)
尝试做同样的事情:
#include <stdio.h>
char* readLine()
{
int i;
char *input;
if ((input = malloc(sizeof(char) * 1024)) == NULL)
return (NULL);
for(i=0;i<1024;i++)
{
input[i]=fgetc(stdin);
if(input[i]=='\n')
{
input[i] = '\0';
break;
}
}
return input;
}
int main()
{
char *str;
if (str = readLine()) != NULL) {
printf("%s\n", str);
free(str);
}
return 0;
}
}
答案 2 :(得分:1)
这里没有任何错误 - 这只是一个警告,因为通常这是新程序员的常见错误。我曾经一直遇到这种用法的问题。
首先......这个“字符串”不是以空值终止的。你需要在函数的末尾添加类似*(input + i) = '\0';
的函数,并使数组大小为1025或条件i < 1023
(以便在缓冲区末尾之外不分配空字符) ),因为目前在函数中使用此数组期望空终止将导致它可能继续超过数组的末尾,从而导致内存访问冲突。或者,你可以使用memset(input,0,1024);
,但仍然要确保条件类似于i < 1023
,这样你收到的标准输入最终不会一直写到数组中的最后一个空字符
另一个问题是这个内存是本地的,因为它“属于”这个功能。对于你在这里的用法,使用相同的内存可能就好了...如果你打算调用函数,用结果做一些事情,然后再次调用函数,用结果做点什么......但是如果你想保留它给你的东西,你将不得不(1)将字符串复制到另一个缓冲区,该缓冲区在将来调用该函数时不会再写入,或者(2) )使函数在每次运行时分配一个新缓冲区,然后确保在完成后删除该内存。例如,代替char input [1024];
(顺便提一下,程序的生命周期会有相同的指针,所以每次都没有必要返回它),你可以写char* input = malloc(1024);
以后再写调用者使用字符串完成,你应该free(input);
。 (当然,在这种情况下,名称可能不是input
,因为您可能不想释放目的是分配它的函数中的内存。)
我稍后会使用显示更改的代码进行编辑。