Массив указателей и вызовов по ссылке - PullRequest
1 голос
/ 10 февраля 2011

У меня небольшая проблема с несколькими простыми строками кода.
Следующие строки я использовал для вызова своего метода:

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

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

Ответы [ 2 ]

3 голосов
/ 10 февраля 2011

Вы передаете назад указатели в переменную, выделенную из стека, input, когда говорите inputs[i] = part, потому что part - это указатель на input, возвращаемый strtok.

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

0 голосов
/ 10 февраля 2011

Ваш код, как я пишу это:

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

Опять же, это не код манжеты, просто исправьте любые ошибки синтаксиса.

Приветствия и hth.,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...