2011-04-13 90 views
0

返回一個字符串,我有一個函數:麻煩與我有在C 串的基本原則麻煩功能

char *editStr(char *str) { 
char new[strlen(str)]; 
... do some editing ... 
return new; 
} 

如何將返回字符,也稱「新」的陣列。據我所知,函數的返回值是一個char *,這意味着它要求一個指向字符串第一個字符的指針。 現在,我想問題是我正在返回一個數組的字符。我試圖返回一個指向「新」中第一個字符的指針,但是這似乎也不起作用。 我試過「return * new [0]」。 我的字符串知識不好。

回答

2

這裏有各種各樣的問題,但與return new;數組/指針的問題是不是其中之一。

首先,你要:

char new[strlen(str) + 1]; 

,讓你有足夠的空間用於空終止。

你的new被分配在堆棧上,所以返回它只會導致悲傷和困惑;你會想:

char *new = malloc(strlen(str) + 1); 

取而代之的是,以便在函數返回時內存仍然有效。

就你真正的問題而言,C中的一個數組就是第一個元素的地址,所以你的return new;沒問題(取決於堆棧和堆的問題)。 C數組在指向帽子的位置時會衰減指針,所以當聲明函數返回指針時,您不必擔心返回數組。

1

這是我看到:

  1. 的 「新」 字是一個C++關鍵字。不要用它來命名變量
  2. 如果要編輯字符串,請直接編輯str。
  3. 如果您需要製作副本,請使用malloc(strlen(str))分配額外的內存。
2

您正在返回一個指向您在堆棧上創建的東西的指針。你不能那樣做。

你需要從堆中malloc()內存並返回(然後free()它以後)

char *editStr(char *str) { 
    char *newArray = malloc(strlen(str) +1); 
    ... do some editing ... 
    return newArray; 
} 

編輯:因爲我忘了加1的字符串結束。如果您想從原始字符串的副本開始,您也可以使用strdup()

+1

不應該是strlen(str)+1(因爲\ 0) – halfdan 2011-04-13 21:35:06

+0

當您發佈時已經在編輯;) – 2011-04-13 21:35:36

0

new變量是堆棧分配的,你不能返回棧變量的引用。

char *editStr(char *str) { 
    char new[strlen(str)]; 
    ... do some editing ... 
    return new; 
} // At this point, Unwinding of stack begins. 
    // new is on stack and the memory allocated to it is deallocated. 
    // So, the returned reference is only pointing to garbage. 

相反,你應該使用malloc和free它一旦完成。

char *new = malloc(strlen(str) + 1) ; // +1 for the the termination character 
0

This文章描述了您正在處理的問題。

返回的指針在C數組的最佳方法是這樣的:

char *getArr() 
    { 
    char *retbuf = malloc(25); 
    if(retbuf == NULL) 
     return NULL; 
    return retbuf; 
    } 
0

當您創建一個普通的C數組時,它將只存在於您創建它的範圍內(在本例中爲函數editStr()),並且只要您從該函數返回就會被銷燬。因此,如果你返回數組指針,它將變得毫無用處,如果你試圖使用它,你的程序很可能會崩潰。您應該使用malloc()動態分配數組。這是相當容易使用:

char *a = (char*) malloc(sizeof(char) * 5); 

這將創造5 char秒的數組,你可以使用,甚至在函數之間傳遞。但是,當它們超出範圍時,它們不會自動被破壞,因此當您完成指針時,需要使用free(a)手動銷燬它們,否則最終會發生內存泄漏。

參見:

0

如果在單線程環境中工作和價值立即使用,您可以將內部緩衝區設置爲靜態,即使退出該功能後,該緩衝區也可用:

char *editStr(char *str) { 
    static char new[strlen(str)]; 
    ... do some editing ... 
    return new; 
} 

您還可以使用普通的舊sprintf樣式:將指向緩衝區的指針傳遞給該函數並將其填充到裏面。

int editStr(char *str, char *new, int new_size) { 
    ... do some editing ... 
    return 0; //can return error 
}