[英]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.