stringstream在c++++中主要用于字符串分割和類型轉(zhuǎn)換。一、字符串分割:使用getline()結(jié)合分隔符可拆分字符串,如用逗號分割”apple,banana,orange,grape”得到各水果名;分隔符可自定義,連續(xù)分隔符可能產(chǎn)生空字符串。二、類型轉(zhuǎn)換:通過重載運(yùn)算符>>提取數(shù)值,如將”123 45.67 true”分別轉(zhuǎn)為int、Float和bool;需注意格式匹配并可用fail()檢測錯誤。三、組合技巧:可先按空格分割日志字符串”id:1001 name:tom age:25″,再逐個去除前綴并轉(zhuǎn)換對應(yīng)類型,適用于結(jié)構(gòu)化文本解析。
在c++中,stringstream是一個非常實(shí)用的工具,尤其適合處理字符串相關(guān)的數(shù)據(jù)轉(zhuǎn)換和分割操作。它不僅簡化了類型之間的轉(zhuǎn)換過程,還能幫助我們高效地進(jìn)行字符串解析。
一、字符串分割:用stringstream輕松拆分內(nèi)容
當(dāng)我們需要將一段以空格、逗號或其他符號分隔的字符串拆分成多個部分時,stringstream結(jié)合getline()就能很好地完成任務(wù)。
比如你有一段這樣的字符串:
立即學(xué)習(xí)“C++免費(fèi)學(xué)習(xí)筆記(深入)”;
string data = "apple,banana,orange,grape";
你可以這樣來分割它:
#include <sstream> #include <vector> stringstream ss(data); string token; vector<string> fruits; char delimiter = ','; // 指定分隔符為逗號 while (getline(ss, token, delimiter)) { fruits.push_back(token); }
這樣,fruits里就依次存儲了 “apple”、”banana” 等字符串。
需要注意的是:
- 分隔符可以是任意字符,比如空格 ‘ ‘ 或冒號 ‘:’
- 如果原始字符串中有連續(xù)多個分隔符,可能會得到空字符串作為結(jié)果,是否過濾取決于具體需求
二、類型轉(zhuǎn)換:從字符串提取數(shù)值并不難
除了字符串分割,stringstream也常用于將字符串中的數(shù)字轉(zhuǎn)換為整型、浮點(diǎn)型等基本類型。
比如有這樣一個字符串:
string numStr = "123 45.67 true";
我們可以這樣提取:
int a; float b; bool c; stringstream ss(numStr); ss >> a >> b >> c;
執(zhí)行后,a=123, b=45.67, c=1(true)。
這里的關(guān)鍵點(diǎn)在于:
例如:
if (ss >> a) { // 成功讀取整數(shù) } else { // 轉(zhuǎn)換失敗,處理錯誤 }
三、組合使用技巧:一邊分割一邊轉(zhuǎn)換
實(shí)際開發(fā)中,常常會遇到混合類型的字符串,比如一行日志:
string line = "id:1001 name:Tom age:25";
我們想從中提取出 ID(整數(shù))、name(字符串)、age(整數(shù))。可以用如下方式處理:
stringstream ss(line); string part; vector<string> tokens; // 先按空格分割各字段 while (ss >> part) { tokens.push_back(part); } // 假設(shè)格式固定,按順序取出并轉(zhuǎn)換 int id = stoi(tokens[0].substr(3)); // 去掉前綴 "id:" string name = tokens[1].substr(5); // 去掉前綴 "name:" int age = stoi(tokens[2].substr(4)); // 去掉前綴 "age:"
這種方式雖然依賴格式一致性,但很適合結(jié)構(gòu)化文本的快速解析。
基本上就這些。stringstream看起來簡單,但在實(shí)際應(yīng)用中靈活多變。掌握好字符串分割和類型轉(zhuǎn)換這兩個核心用法,能解決很多日常數(shù)據(jù)處理問題。