2011-02-09 83 views
1

我有一些簡單的代碼行的小問題。
以下行我習慣叫我的方法:指針和呼叫參考數組

char** paras = new char*; 
inputLength = charUtils::readParameterFromConsole(paras, paraCount, stringBeginningIndex); 

的方法看起來像以下:

int charUtils::readParameterFromConsole(char** &inputs, int &paraCount, int &stringBeginningIndex) { 
    char input[BUFFER_STRING_LENGTH]; 

    cin.getline(input, BUFFER_STRING_LENGTH); 

    if(strlen(input) > 0) 
    { 
     bool stringBeginning = false; 
     char* part = ""; 
     string partString = ""; 

     for(int i = 0; i < paraCount; i++) 
     { 
      if (i == 0) 
       part = strtok(input, " "); 
      else 
       part = strtok(NULL, " "); 

      inputs[i] = part; 
     } 
    } else 
    { 
     cout << "Error! No Input!" << endl; 
    } 

    cout << &inputs[0] << endl; 
    cout << inputs[0] << endl; 

    return strlen(input); 
} 

在該方法中readParameterFromConsole是價值觀正確,但在調用方法,他們AREN」不再糾正。 自從我重構代碼並創建一個新類以來,我正面臨着這個問題。

任何人都可以給我一個建議嗎?

+0

是否'readParameterFromConsole(...)'更改值? – JaredC

+0

是的,在方法結束時,我使用一個簡單的輸出來檢查值。這一切都是正確的,但調用方法失去了所有的價值。 Paras有一些我無法解釋的價值觀。 – CSchulz

+0

它只是「paras」的值不正確嗎?或者其他參數呢?您可以發佈代碼以顯示'readParameterFromConsole()'如何修改參數以及如何輸出值? – JaredC

回答

0

你的代碼,我寫這篇文章:

int charUtils::readParameterFromConsole(char** &inputs, int &paraCount, int &stringBeginningIndex) { 
    char input[BUFFER_STRING_LENGTH]; 

    cin.getline(input, BUFFER_STRING_LENGTH); 

    if(strlen(input) > 0) 
    { 
     bool stringBeginning = false; 
     char* part = ""; 
     string partString = ""; 

     for(int i = 0; i < paraCount; i++) 
     { 
      if (i == 0) 
       part = strtok(input, " "); 
      else 
       part = strtok(NULL, " "); 

      inputs[i] = part; 
     } 
    } else 
    { 
     cout << "Error! No Input!" << endl; 
    } 

    cout << &inputs[0] << endl; 
    cout << inputs[0] << endl; 

    return strlen(input); 
} 

一個主要的問題是,你設置inputs[i] =指針到本地陣列。該函數返回時該數組不再存在。未定義的行爲,如果您使用任何這些指針。

據我所知,你需要一個「單詞」數組作爲結果。

這很容易安排(注:代碼被編譯器的手觸及):

#include <vector> 
#include <string> 
#include <sstream> 
#include <stdexcept> 

bool throwX(char const s[]) { throw std::runtime_error(s); } 

typedef std::vector<std::string> StringVector; 

std::string lineFromUser() 
{ 
    std::string line; 
    std::getline(cin, line) 
     || throwX("lineFromUser failed: std::getline failed"); 
    return line; 
} 

void getWordsOf(std::string const& s, StringVector& result) 
{ 
    std::istringstream stream(s); 
    std::string  word; 
    StringVector  v; 

    while(stream >> word) 
    { 
     v.push_back(word); 
    } 
    result.swap(v); 
} 

StringVector wordsOf(std::string const& s) 
{ 
    StringVector result; 
    getWordsOf(s, result); 
    return result; 
} 

// Some call, like 
StringVector const words = wordsOf(lineFromUser()); 

再次,這是即興代碼,請只是糾正任何語法erors。

乾杯&心連心,

+0

你的意思是由strtok返回的指針? – CSchulz

+0

@ H3llGhost:是的 –

3

您指針傳遞迴堆棧分配的變量,input當你說inputs[i] = part,因爲part是一個指針到input通過strtok退還。

http://www.cplusplus.com/reference/clibrary/cstring/strtok/

+0

感謝您的建議,但我無法處理它。 – CSchulz

+0

@ H3llGhost:你的意思是你需要進一步的解釋嗎? – James

+0

是的,因爲我不明白爲什麼它在同一個班級當地工作,但不在不同的班級。 – CSchulz