2011-02-09 3 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 являются значения правильны, но в вызывающем методе они Арен» t корреляции. Я столкнулся с этой проблемой, так как я реорганизовал код и создаю новый класс.

Может ли кто-нибудь дать мне совет, пожалуйста?

+0

ли 'readParameterFromConsole (...)' изменить значения? – JaredC

+0

Да, и в конце метода я использую простой вывод для проверки значений. Все правильно, но метод вызова потерял все значения. Парас имеет некоторые значения, которые я не могу объяснить. – CSchulz

+0

Это просто «парас», который имеет неправильные значения? Или другие параметры тоже? Можете ли вы опубликовать код, чтобы показать, как '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

Смежные вопросы