簡體   English   中英

拆分字符串時C ++不完整的輸出

[英]C++ incomplete output when splitting string

我試圖從這樣的字符串中提取某些數據:

2833ae7~2be;2833ae8~2272

我想要做的是首先用冒號分割它,然后每個記錄,查找它是否包含2be然后將包含它的記錄分割為~2be ,然后給我~2be之前的值

我寫了一些文章,這段代碼可以做到,但問題是它沒有給我完整的輸出:

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

vector<string> split(string str,string sep){
    char* cstr=const_cast<char*>(str.c_str());
    char* current;
    vector<string> arr;
    current=strtok(cstr,sep.c_str());
    while(current!=NULL){
        arr.push_back(current);
        current=strtok(NULL,sep.c_str());
    }
    return arr;
}

int main(){
string items = "2833ae7~2be;2833ae8~2272";
vector<string> food = split(items, ";");
for(unsigned int i = 0; i < food.size(); i++)
{
    if(food[i].find("2be") != string::npos)
    {
        vector<string> arr = split(food[i],"~2be");


        cout << "Output ("<< i << ") = " << arr[0] << endl;

        }// end if

}// end for

    return 0;
}// end main

我得到的輸出是:

Output <0> = 833a

什么時候應該:

Output <0> = 2833ae7

我做錯了什么?

正如其他人在評論中提到的那樣,修改從std::string::c_str()獲得的字符數組是未定義的行為。 strtok()修改了它的參數來標記token,所以你不能在這里使用它。

通過單字符分隔符拆分std::string並不難。 你可以這樣做的一種方法是這樣的:

std::vector<std::string> split(const std::string &input, std::string::value_type delim)
{
    std::stringstream ss(input);
    std::vector<std::string> tokens;
    std::string token;
    while (std::getline(ss, token, delim))
    {
        tokens.push_back(token);
    }

    return tokens;
}

然后,您可以像這樣拆分字符串:

std::vector<std::string> tokens = split("2833ae7~2be;2833ae8~2272", ';');

這將為您提供一個包含兩個元素的向量:“2833ae7~2be”和“2833ae8~2272”。

現在對於第二部分,您不能使用相同的split()方法,因為它僅適用於單字符分隔符。 但是你可以做這樣的事情:

for (std::size_t index = 0; index < tokens.size(); ++index)
{
    if (tokens[index].find("2be") != std::string::npos)
    {
        std::string::size_type pos = tokens[index].find("~2be");

        std::cout << "Output (" << index << ") = " << tokens[index].substr(0, pos) << "\n";
    }
}

使用相同的想法,您還可以嘗試重寫split()方法以使其適用於字符串分隔符,而不僅僅是像我的版本那樣的單字符分隔符。

暫無
暫無

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

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