解析字符串并将整数值推送到结构体的向量c ++

时间:2015-06-23 05:08:02

标签: c++ struct

我的cpts类有这个赋值,我需要解析一个看起来像这样的字符串

组(45,0; 34,1; 12,2)

结构是

struct item
{
    int value;
    int index;
};

所以在本质上,如果向量中的第一个项目是

{value = 45 
index = 0}

" set" lineseperates的价值和指数,其中;分离整个项目对象。我解析这条线的第一次尝试就是:

int index = 7;
int data = 4;
int a = 0;
item *i;
vector<item> newVect;
for (a = 0; a < fromfile.length(); a++)
{

    i->value = stoi(fromfile.substr(data));
    i->index = stoi(fromfile.substr(index));

    newVect.push_back(*i);


    index += 5;
    data  += 5;

    i++;
}

但是当索引和数据超出行范围并且不确定如何仅从行中提取整数时它会崩溃。请帮忙!这是我坚持的任务的唯一部分。我在过去的10个小时里一直试图解决这个问题。很抱歉任何格式问题,在编码论坛上发布新内容。

我的set函数接受一个字符串&amp;线型

2 个答案:

答案 0 :(得分:0)

它崩溃了,因为你没有指出&#34;我&#34;什么,但你取消引用它!

i->valuei->data此时内存中的任意位置,您可能会覆盖不应该的内容。

不使用item *i;,而是使用item i。然后使用i->代替使用i.,而不是使用push(*i),而只使用push(i)

你的代码的另一个原因是&#34;崩溃&#34;是你假设大小不变的记录(+ = 5)。相反,您需要找到下一个&#39; ,&#39;,&#39; ;&#39;或&#39; )&#39;。

最后一个原因是你从0到字符串的长度(在这种情况下是20)运行。但你是&#34;索引&#34;和&#34;数据&#34;值分别达到7 + 5 * 20和4 + 5 * 20。这远远超出了字符串的结尾。 (分别为107和104,对于20字节长的字符串)。

答案 1 :(得分:0)

您的代码存在许多问题,但我会专注于崩溃的代码。

item *i;

这会创建一个指针变量i,没有默认值。使用此变量将导致“未定义的行为”,包括崩溃。

i->value = stoi(fromfile.substr(data));
i->index = stoi(fromfile.substr(index));

你还没有为i分配一个值,所以它指向内存中的一些随机位置。这很糟糕,会导致未定义的行为,包括崩溃。

newVect.push_back(*i);

您明确取消引用未初始化的i,将其值复制到newVect后面的新项目中。 i未被初始化,因此......未定义的行为。

i++;

问题:什么是未初始化+ 1? 答:未初始化。

我不会帮你解决你的指针问题,因为你复制*i似乎没必要:

item i; // no pointer, now we have an i to work with.

for ( ... ) {
    i.value = ...;
    i.index = ...;
    newVect.push_back(i);
    // don't do i++
}

这解决了你的问题,但有点浪费,因为我们必须复制一切。如果您可以访问C ++ 11,则可以执行以下操作:

#include <iostream>
#include <vector>

struct Item {
    Item (int value_, int index_) : value(value_), index(index_) {}
    int value;
    int index;
};

int main()
{
    int index = 7;
    int data = 4;
    std::vector<Item> newVect;
    for (size_t i = 0; i < 10; ++i) {
        newVect.emplace_back(index, data);
        index += 5;
        data  += 5;
    }    

    for (size_t i = 0; i < newVect.size(); ++i) {
        std::cout << "#" << i << ": " << newVect[i].value
            << ", " << newVect[i].index << "\n";
    }
}

请参阅http://ideone.com/6NoMba