2012-07-27 78 views
0

我一直在試圖返回一個函數的字符串數組爲幾天無濟於事。當我搜索StackOverflow的時候,我發現擁有一個將被分配數組值的參數會更好。所以,這裏是我的代碼示例(不是實際的用法,而是我試圖使用該函數的模型)。如果代碼有點草率,我很抱歉。我一直在對它進行測試。分配字符串數組的分段錯誤

void splitOn(string message, string delim, string***toCh) { 

string** rString = new string*; 
string lArr[numberOf(message, delim)+1]; 
for(int index=0; index<numberOf(message, delim)+2; index++) { 

    lArr[index]=message.substr(0, message.find(delim)).c_str(); 

    message = message.substr(message.find(delim)+1, message.length()); 
rString[index]=&lArr[index]; 

cout << "IN LOOP "<<*rString[index]<<endl; 
} 
rString[numberOf(message, string(delim))] = &message; 
toCh=&rString; 
} 

int main(){ 
string***arr; 
splitOn("fox.over.lazy.dog", ".", arr); 
cout << **arr[0]<<endl; 

注:

  • numberOf()將一個字符串分隔符(串),並返回多少次的分隔符的字符串內找到。

  • 串是從的std :: string

  • lArr(循環內的本地陣列)和* RSTRING都給予正確的輸出。

  • 雖然我想將數組賦值給一個參數,但學習如何返回一個數組更吸引我。

我可以用文件和getLine()一起破解這個,但我更願意學習如何正確地做到這一點。

+0

你已經在使用'std :: string'。當你在它的時候去'std :: vector'。我也不確定你爲什麼有'*** ***'。 – chris 2012-07-27 23:41:56

+1

如果你需要一個動態的字符串集合,那麼在一個合理的C++程序中不要使用'***'...使用'std :: vector '。 – 2012-07-27 23:44:04

+0

@chris我會使用std :: vector,但我更願意使用數組,因爲我打算在C中重寫這個數據,並且想從根本上理解爲什麼這不起作用。 – 2012-07-27 23:45:01

回答

0

你試圖返回局部變量,這將永遠不會工作。您和您的調用者需要就如何分配返回值達成一致。在C++中,評論者提到這通常是通過傳遞一個引用來處理你的分配來完成的。

在C你有兩個選擇,您可以讓來電者在一個足夠大的分配通過,或被叫方使用的malloc多次調用(不要忘記調用在調用者釋放!)

例如,如果傳遞可寫字符數組,則可以簡單地用空字符覆蓋分隔符字符,將其分割爲單個字符串而不必分配新副本。

+0

你是對的。這個問題是由局部變量引起的,所以我把字符串變成了全局變量。 – 2012-07-28 00:12:30

+4

「所以我做了字符串全局和它的作品」 - Eeeek !!!!! – paulsm4 2012-07-28 00:16:41