2014-10-08 114 views
-1

你們可以幫我理解爲什麼我的函數不允許我返回一個字符串。我在這個網站上查看了一些代碼,我似乎無法使其工作。答覆其他的問題都建議人們定義功能:C - 返回字符串

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

任何幫助,將不勝感激。謝謝

+1

考慮消息 – 109 2014-10-08 22:16:03

+0

本地地址的範圍不能用於更高級別的範圍。 但是可以通過連接返回字符串文字,如下所示。 (1)列出服務器上的所有文件\ n「 」(2)從服務器檢索文件\ n「 (3)從服務器檢索所有文件\ n「 」(4)關閉連接\ n「 」輸入您的選擇:\ n「; 返回消息; ' }' – BLUEPIXY 2014-10-08 22:30:31

回答

4

message的存儲在printMenu()函數末尾不存在(因爲它是本地數組)。所以你不能簡單地return message然後能夠稍後訪問字符串。這是未定義的行爲並且不正確。

字符串是尷尬的C.處理您可以:

  1. 在調用者的字符串分配空間,並具備的功能將數據複製到該空間。
  2. 有功能配置新空間並返回指針,要求調用者清理分配的空間。
+2

第三種方法是使用'static char message [100];',雖然它有它自己的一套缺點。 – sfstewman 2014-10-08 22:17:33

0

這裏有兩個主要問題: 1.變量消息是一個本地數組,因此在堆棧上創建。當函數返回時,它將指針返回到堆棧中已經回滾的地址。

  • 您有尺寸100的陣列,並且已串接超過100個字符,實際上破壞堆