2015-11-18 54 views
-4

我正在下面作業的問題:如何從C中的函數返回字符串?

鑑於姓和名作爲參數,寫的 功能createFBlink()代碼。這些函數返回一個facebook鏈接 ,它作爲Facebook用戶的備用電子郵件。持有facebook鏈接的變量 應包含存儲表示facebook鏈接的字符串所需的最小字節數 。如果 不是名字或姓氏,則函數返回NULL

例如,如果firstname = tzuyulastname = chou, 的臉書鏈接是[email protected]

(查看原始問題陳述here

我一直在試圖將一個字符串返回從createFBlinkmain。我已經嘗試了多種方法,例如將char變成靜態,但我不斷收到我無法理解的錯誤,因爲我沒有很多C的使用經驗。

我使用malloc ,但我遇到了一個問題,其中如果有從我從main發送的函數的參數,我最終會在輸入後崩潰。這裏是我到目前爲止的代碼:

#include <string.h> 
#include <conio.h.> 
#include <stdio.h> 
#include <stdlib.h> 

char *createFBlink(char *firstname , char *lastname) ; 

int main(void) 
{ 
    char firstname[24] , lastname[24], fblink[24] ; 

    printf("Enter first name: "); 
    scanf("%s", firstname); 
    firstname[strlen(firstname)] = '\0'; 
    printf("\n Enter last name: "); 
    scanf("%s", lastname); 
    lastname[strlen(lastname)] = '\0'; 


    *fblink = createFBlink(firstname, lastname); 
    if(*firstname == '\0'){ 
     printf("no facebook link generated"); 
    }else{ 
     printf("%s", *fblink); 
    } 
    getch(); 
    return 0; 
} 

char * createFBlink(char *firstname , char *lastname) 
{ 
    int check1 = strlen(firstname) , check2 = strlen(lastname), num = check1+check2; 
    char link = (char*) malloc(sizeof(char) * num); 
    if(check1 == 0 || check2 == 0){ 
     *firstname = '\0' ; 
    }else{ 

     strcat(*lastname, "."); 
     strcat(*lastname, firstname); 
     strcat(*lastname, "@facebook.com"); 
     strcpy(link , *lastname); 
     return link; 
    } 
} 
+0

什麼是崩潰?什麼線路導致它? (即使你不明白) –

+0

啓用警告並嘗試重新編譯。 – this

+0

如果你想發佈問題,你至少可以在這裏重新輸入,而不是發佈一個鏈接到你的老師的powerpoint圖片 – dietbacon

回答

1
*link = (char *) malloc(24); 

這是不正確,應該是

link = (char *) malloc(24); 

*link(同link[0])是link指向字符串的第一個字符,該分配只是覆蓋字符,而不是改變指針。

下面的內容也是不正確的:

*fblink = createFBlink(firstname, lastname); 

此:

strcat(*lastname, ...); 

就是以同樣的方式不正確。您將得到由lastname指向的字符串的第一個字符,將其轉換爲指針並將此(顯然無效的)指針傳遞給strcat。這是墜機最可能的原因。 此外,24個字符可能不足以容納連接的字符串。

試着讀一本關於在C中使用指針的書,試圖通過試錯法理解它們可能不是最有效的方法。

+1

'link =(char *)malloc(24)'是[技術上正確,但是樣式不佳](http://stackoverflow.com/a/605858/824425)。 –

+0

@Rhymoid,你說得對,但是如果沒有演員陣容,它將無法通過C++編譯器進行編譯,那是一種「肌肉記憶」輸入。不知道我是否需要編輯答案。 – Paul

+0

嗨!在處理指針時我有一些知識,但動態分配對我來說是一個非常新的主題。實際上,代碼中存在的一些錯誤是因爲挫折和試錯。 我真的很難過的一件事是 * fblink = createFBlink(firstname,lastname); 我不知道這是如何工作,沒有以前的答案有這樣的事情。 – Jake

0

使用字符串時,您需要了解您正在使用的類型。

這是固定大小的內存固定區域。

char buffer [24]; 

這是一個動態分配的緩衝區必須釋放

char* szBuffer = malloc(24); 
free(szBuffer) 

而不是做那個正確的,你的createFBlink做的malloc兩次,並免費零次。

如果你從一個函數返回一個malloc'ed緩衝區,你仍然必須釋放它。

char * result = createFBlink(stuff); 
free(result); 

由於類型不同,您需要使用另一個函數將字符串數據從一個移動到另一個。

char * result = createFBlink(stuff); 
strcpy(fblink, result, sizeof(fblink)); 
free(result); 

然後你在分配空間之外寫入會有額外的風險。讓我們嘗試一個帶有一些常用名字的化妝名稱。

firstname "Richard" 
lastname "Hernandez" 
returned string "[email protected]" 

哦,看一下,24個字符串中的31個字符。我們只是在計算機上的某個地方覆蓋了一些東西。從字面上看,任何事情現在都可能發生。

所以你有各種風險。你必須匹配malloc與免費。你必須跟蹤尺寸。所有這些都被認爲是非常糟糕的C++風格。強烈建議使用std :: string類。你希望你的字符串類能夠處理所有的資源管理,所以當你使用它的時候你不能搞亂它。

std::string CreateFacebookLink (const std::string &firstname, const std::string &lastname){ 
    return firstname + "." + lastname + "@facebook.com"; 
} 

std::string strFacebookLink (CreateFacebookLink("Richard", "Hernandez"));