【问题标题】:Returning a string [char pointer] from a function [duplicate]从函数返回字符串 [char 指针] [重复]
【发布时间】:2015-01-02 23:54:06
【问题描述】:

我正在编写一个程序,它从标准输入返回一个字符串,但我收到警告,它返回一个本地变量的地址。如何返回字符串?

提前致谢

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

【问题讨论】:

  • 你正在从一个函数返回一个本地对象,一旦函数返回,它的生命周期就结束了。动态分配内存或传递可以从函数返回的变量。
  • 这样可以吗? #include #include void nacitajRiadok(char *input[1024]) { int i; for(i=0;i
  • 您应该复制编译器准确告诉您的内容。对于您的问题,错误是显而易见的(返回一个没有复制语义的变量)。您应该始终提供您所拥有的最多信息来帮助其他帮助您的人。
  • 第二个解决方案没有任何警告,所以我认为它还可以
  • 这里有一个很好的例子,说明如何在 C 语言中使用字符串和指针做不同的事情 stackoverflow.com/a/46344713/5842403

标签: c string return fgetc


【解决方案1】:

这应该适合你:

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

}

【讨论】:

  • 如果我传递一个大小为 10 的字符串怎么办?
  • @2501 感谢所有提示!我想今天不是我的日子
【解决方案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;
}

}

【讨论】:

    【解决方案3】:

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

    第一件事......这个“字符串”不是以空值结尾的。您需要在该函数的末尾放置 *(input + i) = '\0'; 之类的内容,并使数组大小为 1025 或条件 i &lt; 1023 (这样空字符就不会分配到缓冲区末尾之外),因为在在期望空终止的函数中使用此数组的那一刻将导致它可能继续超过数组的末尾,从而导致内存访问冲突。或者,您可以使用memset(input,0,1024);,但仍要确保条件类似于i &lt; 1023,这样您收到的标准输入就不会一直写入到数组中的最后一个空字符。

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


    稍后我将使用显示更改的代码进行编辑。

    【讨论】:

      猜你喜欢
      • 2016-06-10
      • 1970-01-01
      • 2013-08-03
      • 1970-01-01
      • 2021-02-14
      • 2021-08-14
      • 2018-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多