【问题标题】:C - returning string [duplicate]C - 返回字符串 [重复]
【发布时间】:2014-10-08 22:13:44
【问题描述】:

你们能帮我理解为什么我的函数不允许我返回一个字符串吗?我已经查看了该站点上的一些代码,但我似乎无法让它工作。对其他问题的答复建议人们将函数定义为:

const char * stringToRetrun(){ /*do some work*/ return string; }

但是,当我尝试遵循相同的格式时,我的编译器会吐出一大堆无效类型错误/警告。

我在下面发布了我的问题:

char * printMenu()
{   
    char message[100] = "Select an option from below:\n";
    strcat(message, "(1) List all files on server\n");
    strcat(message, "(2) Retrieve file from server\n");
    strcat(message, "(3) Retrieve all files from server\n");
    strcat(message, "(4) Close connection\n");
    strcat(message, "Enter your selection:\n");

    return message;
}

任何帮助将不胜感激。谢谢

【问题讨论】:

  • 想想消息的范围
  • 本地地址不能在上级范围内使用。但是可以通过如下连接返回字符串文字。 const char *MenuString(){ const char *message = "Select an option from below:\n" "(1) List all files on server\n" "(2) Retrieve file from server\n" "(3) Retrieve all files from server\n" "(4) Close connection\n" "Enter your selection:\n"; return message; }

标签: c


【解决方案1】:

message 的存储在 printMenu() 函数的末尾之后不存在(因为它是一个本地数组)。因此,您不能简单地 return message 然后稍后就可以访问该字符串。这是未定义的行为并且不正确。

字符串在 C 中难以处理。您可以:

  1. 在调用者中为字符串分配空间,并让函数将数据复制到该空间中。
  2. 让函数分配新空间并返回一个指针,要求调用者清理分配的空间。

【讨论】:

  • 第三种方法是使用static char message[100];,尽管它有其自身的缺点。
【解决方案2】:

这里有两个主要问题: 1. 变量 message 是一个本地数组,因此在堆栈上创建。当函数返回时,它会返回指向堆栈上已经回滚的地址的指针。

  1. 您有一个大小为 100 的数组,并且您连接了 100 多个字符,实际上破坏了堆栈

【讨论】:

    猜你喜欢
    • 2016-07-13
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2011-04-01
    • 1970-01-01
    • 2018-09-27
    相关资源
    最近更新 更多