2011-02-09 7 views
1

몇 줄의 간단한 코드에 약간의 문제가 있습니다.
다음 라인 내 메서드를 호출하는 데 사용 :포인터 배열과 참조에 의한 호출

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

방법은 다음과 같습니다 : 방법 readParameterFromConsole에서

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

는 값이 정확하지만, 호출 방법에 그들은 때로 믿을 수 ' 더 이상 t correcy. 코드를 리팩토링하고 새로운 클래스를 만들 때부터이 문제에 직면하고 있습니다.

아무에게도 조언 해주실 수 있습니까? 당신이 inputs[i] = part을 말할 때 partstrtok로 다시 넘겨 input에 대한 포인터이기 때문에

+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

당신은 스택 할당 변수, input로 포인터를 다시 전달된다. 내가 이것을 쓰고 있어요으로

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

+0

주저하지 말고 조언 해 주셔서 감사합니다.하지만 처리 할 수 ​​없습니다. – CSchulz

+0

@ H3llGhost : 더 자세한 설명이 필요한가요? – James

+0

예, 같은 클래스에서 로컬로 작동하는 이유는 알 수 없기 때문에 그렇습니다.하지만 다른 클래스에는 없습니다. – CSchulz

관련 문제