从函数返回一个字符串[字符指针]

问题描述:

我正在写一个程序,它从stdin返回一个字符串,但我得到警告,它返回一个本地可变的地址。我怎样才能返回字符串?从函数返回一个字符串[字符指针]

在此先感谢

#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; 
} 
+3

您正从函数返回一个函数返回一个本地对象,该函数的生存期结束。动态分配内存或传递可从函数返回的变量。 – 2014-11-06 12:59:59

+0

这是好吗? 的#include 的#include 空隙nacitajRiadok(字符*输入[1024]) { INT I; (i = 0; i nocturne 2014-11-06 13:06:38

+0

您应该复制过去编译器准确告诉您的内容。对你来说,这个错误是显而易见的(返回一个没有复制语义的变量)。您应该始终提供您必须帮助其他人帮助您的大部分信息。 – mathk 2014-11-06 13:07:09

这应该为你工作:

您可以从主传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; 

} 
+0

如果我通过一串大小10? – 2501 2014-11-06 13:03:49

+0

@ 2501感谢您的所有提示!我想今天不是我的一天 – Rizier123 2014-11-06 13:13:48

尝试做这样的事情,而不是:

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

}

这里没有什么错 - 这只是一个警告,因为通常这是新程序员的常见错误。我以前常常遇到这种用法的问题。

第一件事......这个“字符串”不是空终止的。你会想在这个函数的末尾加入类似*(input + i) = '\0';的东西,并且使数组大小为1025或者条件为i < 1023(这样空字符就不会被分配超过缓冲区的末尾),因为此时使用这个数组中的函数需要空终止会导致它可能继续超过数组的末尾,导致内存访问冲突。或者,您可以使用memset(input,0,1024);,但仍然要确保条件类似于i < 1023,以便您收到的标准输入不会最终写入数组中最后一个空字符。

另一个问题是,这个内存是本地的,就像它“属于”这个函数一样。而对于你在这里的用法,使用相同的内存可能就好了......如果你打算调用函数,对结果做些什么,然后再次调用函数,对结果做些什么...但是如果你想保留它给你的东西,你必须或者(1)将该字符串复制到另一个缓冲区,这个缓冲区在将来被调用时不会再被写入,或者(2 )使函数在每次运行时分配一个新缓冲区,然后确保在完成该操作时删除该内存。例如,而不是char input [1024];(顺便说一下,程序的生命周期会有相同的指针,所以不必每次都返回),那么当调用者完成字符串时,您可以编写char* input = malloc(1024);及更高版本,你应该free(input);。 (当然,这个名字可能不是input在这种情况下,因为你可能不想免费,其目的是为它分配函数的内存。)


我会用代码显示变化后编辑此。