2011-02-09 20 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は正しい値ですが、呼び出し元のメソッドに彼らが上がりませんそれ以上の間は正しい。 私はコードをリファクタリングして新しいクラスを作成して以来、この問題に直面しています。

誰も私に助言を与えることはできますか?

+0

は 'readParameterFromConsole(...)'の値を変更していますか? – JaredC

+0

はい、方法の終わりに私は単純な出力を使って値をチェックします。すべて正しいですが、呼び出しメソッドはすべての値を失います。 Parasには私が説明できないいくつかの価値があります。 – CSchulz

+0

不正な値を持つのは 'paras'ですか?または他のパラメータも? 'readParameterFromConsole()'がどのようにパラメータを変更し、どのように出力するのかを示すコードを投稿できますか? – JaredC

答えて

0

あなたのコードは:あなたがローカル配列にinputs[i] =ポインタを設定していることを

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

主な問題です。関数が返っても、その配列はもう存在しません。これらのポインタのいずれかを使用すると、未定義の動作が発生します。

私が理解しているように、結果として「単語」の配列が必要です。 (:コンパイラの手によって触れられていないコード注):アレンジするのは簡単です

再び

#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を修正してくださいです。

乾杯& HTH。、

+0

あなたはstrtokによって返されるポインタを意味しますか? – CSchulz

+0

@ H3llGhost:はい –

3

あなたはinputs[i] = partを言うときpartstrtokにより返還inputへのポインタであるので、変数、inputを割り当てられたスタックへのポインタをバック渡しています。私はこれを書いているよう

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

+0

アドバイスありがとうございますが、私はそれを処理できません。 – CSchulz

+0

@ H3llGhost:それ以上の説明が必要なのですか? – James

+0

はい、私は同じクラスではローカルで動作する理由がわかりませんが、別のクラスでは動作しません。 – CSchulz

関連する問題