Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中返回类型为字符串的函数_C_Function_Return Type - Fatal编程技术网

C中返回类型为字符串的函数

C中返回类型为字符串的函数,c,function,return-type,C,Function,Return Type,我需要一个函数来返回字符串。我使用以下代码声明函数: const char* serv_con(char app_data[50]) { char send_data[1024],recv_data[1024]; //i am avoiding code segments irrelevant to the issue. return recv_data; } 然后调用main中的函数,如下所示: int main() { char ser_data[50],

我需要一个函数来返回字符串。我使用以下代码声明函数:

const char* serv_con(char app_data[50])
{
    char send_data[1024],recv_data[1024];
    //i am avoiding code segments irrelevant to the issue.
    return recv_data;
}
然后调用main中的函数,如下所示:

int main()
{
    char ser_data[50], app_data[50];
    ser_data[0] = '\0';
    app_data[0] = '\0';
    //avoiding code segments irrelevant to the issue.
    app_data = serv_con(ser_data); //function call
}
int main()
{
    char ser_data[50], app_data[50];
    ser_data[0] = '\0';
    app_data[0] = '\0';
    //avoiding code segments irrelevant to the issue.

    serv_con(ser_data, app_data); //function call
}
编译时会出现以下错误:

connect.c:109: error: incompatible types when assigning to type ‘char[50]’ from type ‘const char *’
然后我用std::string替换了声明中的const char。现宣布如下:

std::string serv_con(char app_data[50])
{
    char send_data[1024],recv_data[1024];
    //avoiding code segments irrelevant to the issue.
    return recv_data;
}
并以与上述相同的方式对其进行了调用。但在编译时仍会出现以下错误:

connect.c:13: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘:’ token

请告诉我如何将字符串作为函数的返回类型。我工作的平台是linux。提前谢谢。

你现在做的真是个坏主意。
serv_con
函数在堆栈上为
recv_data
数组分配一些空间,然后返回指向该位置的指针。当然,只要调用另一个函数,数据就会被删除,从而导致难以诊断的错误。如果必须从函数返回内存块,请使用
malloc
分配它。基本上,永远不要返回指向堆栈上对象的指针

当您从
serv\u con
中取出指针时,将其分配给
app\u data
,该数据已经分配了一些空间。没有理由这样做:只需将
app\u data
声明为
char*
,它将指向
serv\u con
中分配的存储

const char* serv_con(char app_data[50])
{
  char send_data[1024],recv_data[1024];
  //i am avoiding code segments irrelevant to the issue.
  return recv_data;
}
这无法工作,因为您正在返回一个指向局部变量的指针,该指针在返回后无效。您需要在堆上分配
recv\u数据
,以便在返回后使用它

char* serv_con(char app_data[50])
{
  char send_data[1024];
  char *recv_data = malloc(1024);
  if (!recv_data)
      return NULL;

  // ...
  return recv_data;
 }
然后将main函数更改为

int main()
{
 char ser_data[50];
 char *app_data;
 ser_data[0] = '\0';
 //avoiding code segments irrelevant to the issue.
 app_data = serv_con(ser_data); //function call
 if (!app_data) {
   // error
 }
}

将指针返回到本地数组或数组本身是个坏主意

即使在函数内部执行malloc,调用方也需要释放内存,这同样不是一个很好的做法

我建议最好的方法是传递一个参数,即传递希望将结果复制为参数的数组

int serv_con(char app_data[50], char recv_data[50])
{
    char send_data[1024];
     //recv_data[1024];
    //i am avoiding code segments irrelevant to the issue.
    return 1; // return status success or failure which can be tested in main
}
然后调用main中的函数,如下所示:

int main()
{
    char ser_data[50], app_data[50];
    ser_data[0] = '\0';
    app_data[0] = '\0';
    //avoiding code segments irrelevant to the issue.
    app_data = serv_con(ser_data); //function call
}
int main()
{
    char ser_data[50], app_data[50];
    ser_data[0] = '\0';
    app_data[0] = '\0';
    //avoiding code segments irrelevant to the issue.

    serv_con(ser_data, app_data); //function call
}

我发现并改正了一个小错误。您在main中传递的app_数据大小为50,其中您试图从函数serv_con返回的数据大小为1024。这应该是一致的。我在上面的代码中都使用了50码。

从你的问题中,我可以非常肯定你是一个初学者。请通读一本好的课本,例如

除了错误之外,您一定还收到了此信息。
警告:函数返回局部变量的地址


请始终注意警告。这个问题已经被./p>回答了,这不是C++。不要标记C++,为什么使用const?这意味着不能修改值。您仍然试图在代码中的某个地方修改它。我避免了
常量
并尝试了
char*
,但它仍然给出相同的错误。但是我需要字符串
app_data
最初为空。我该怎么做?它不包含任何数据,在调用
serv\u-con()
之前无效。如果您以前需要使用
app\u data
,您可能需要一个额外的变量来存储
serv\u-con()
的返回值,或者在调用
serv\u-con()
之前只释放
app\u-data
。我已经按照您说的做了。现在所有的错误都消失了,但我仍然收到以下警告:
connect.c:107:warning:assignment丢弃指针目标类型的限定符
。如果这是一个问题?你能从
connect.c
发布第107行吗?只需将
serv_-con()
定义为
char*serv_-con(char-app_-data[50])
,警告就会消失。你关于在函数内部分配内存并将其释放到外部的评论是完美的。但是有没有一种方法可以让我们编写一个函数,它接受一个char数组,处理这个数组并生成一个输出(这个输出数组的长度根据输入而变化)。这里的输出数组大小是动态的,因此有可能处理这种情况*在函数调用前后从调用的角度分配和释放输出数组可能不是一个好主意。