将字符串解析为c_strings数组

时间:2014-02-07 04:53:58

标签: c++ arrays parsing

我编写了一些代码,以便将字符串(使用getline()读入)转换为c_strings数组。我遇到的问题是我正在阅读的项目没有正确存储在数组中。我最初根据它们之间的空格数来解析输入,然后从那里开始,但这也给我带来了同样的问题。所以我将解析改为我下面的内容,并且我得到了同样的问题,向我建议我的解析工作,但是在读取解析到char *数组的过程中的某个地方,出现了问题。

我的代码:

int i = 0;
unsigned inputSize = input.size();
unsigned int prev = 0; //prev as in previous space position
while((prev = input.find(' ', prev)) < inputSize) {
    ++i;    ++prev;        
}
char* charArray[i + 2];
memset(charArray, '\0', i + 2);  
stringstream ss(input);
string buffer;
for(int a = 0; ss >> buffer; ++a) {
    charArray[a] = const_cast<char*>(buffer.c_str());
}

我正在做的是我计算输入的空格数,并使该数字的char *数组+2(+2因为我需要以NULL结束它)。之后,我解析我的输入并将其读入数组。我正在使用ss&gt;&gt; buffer作为我的终止子句,因为我不会最终为charArray分配内存以外的内存。 buffer.c_str得到一个const char *,所以我const_cast它,以便我将它存储到char *的(非const)数组中。我使用memset将所有元素设置为NULL,因为我知道它将被写入,除了最后一个元素,我想保持为NULL。

测试:

Input: Why hello world
Output: Junk

我的计划内部出了什么问题?

2 个答案:

答案 0 :(得分:0)

只有buffer.c_str()中存储的字符串未被修改,buffer返回的指针才有效。如果您需要修改buffer,则必须事先复制其内容,如果您以后需要旧内容。

答案 1 :(得分:0)

请参阅Right way to split an std::string into a vector [duplicate]

Live Example

#include <iostream>
#include <sstream>
#include <iterator>
#include <vector>
using namespace std;

int main(int argc, char *argv[]) {
    std::string input = "Why hello world";
    std::stringstream ss(input);

    std::vector<std::string> vstrings(std::istream_iterator<std::string>(ss),
        std::istream_iterator<std::string>{}); // C++11 brace syntax
    char** charArray = new char*[vstrings.size()];
    for (unsigned int i = 0; i < vstrings.size(); i++)
        charArray[i] = (char*)vstrings[i].c_str();
    for (unsigned int i = 0; i < vstrings.size(); i++)
        std::cout << charArray[i] << "\n";
    delete[] charArray;
}
相关问题