簡體   English   中英

解析字符串並將整數值推入結構的向量C ++

[英]Parsing a string and pushing integers values into vector of structs c++

我的cpts類有此分配,我需要在其中解析一個看起來像這樣的字符串

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

結構是

struct item
{
    int value;
    int index;
};

因此,從本質上講,向量中的第一項是否為

{value = 45 
index = 0}

“ set”行中的,用於分隔值和索引,其中; 分隔整個項目對象。 我第一次嘗試解析該行是:

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函數接受字符串和線型

它崩潰是因為您沒有將“ i”指向任何東西,但是您取消了引用它!

i->valuei->data在內存中的任意位置,您可能會覆蓋不應該覆蓋的內容。

而不是使用item *i; ,使用item i 然后不使用i->使用i. ,而不是使用push(*i) ,而要使用push(i)

您的代碼“崩潰”的另一個原因是您假設記錄大小不變(+ = 5)。 相反,您需要找到下一個' , ',' ; '或' ) '。

最終的原因是您正在運行從0到字符串的長度(在本例中為20)。 但是您的“索引”和“數據”值分別上升到7 + 5 * 20和4 + 5 * 20。 這遠遠超出了字符串的末尾。 (對於20個字節長的字符串,分別為107和104)。

您的代碼有很多問題,但我將重點介紹那些崩潰的問題。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM