指针数组和引用调用

时间:2011-02-09 21:37:58

标签: c++ pointers

我对一些简单的代码行有一点问题 以下几行我用来调用我的方法:

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 个答案:

答案 0 :(得分:3)

当您说input时,您正在将指针传递回堆栈分配变量inputs[i] = part,因为partinput指向strtok的指针}。

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

答案 1 :(得分: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() );

同样,这是关闭袖口代码,请纠正任何语法错误。

干杯&amp;第h。,