一狂男、準(zhǔn)備知識(shí)
在分割字符串之前署尤,先來了解一些跟字符串相關(guān)的變量或函數(shù):
(1)size_type:size_type由string類類型和vector類類型定義的類型肋僧,用以保存任意string對(duì)象或vector對(duì)象的長(zhǎng)度眨唬,標(biāo)準(zhǔn)庫類型將size_type定義為unsigned類型绷落。
(2)string的find("x")函數(shù)卸例,若找到則返回x的位置称杨,沒找到則返回npos肌毅。npos代表no postion,表示沒找到姑原,其值為-1
#include <iostream>
using namespace std;
int main()
{
string s = "abcdefg";
int x = s.find("abc");
int y = s.find("ddd");
cout << x << endl;
cout << y << endl;
return 0;
}
運(yùn)行結(jié)果:
0
-1
(3)substr(x, y)
basic_string substr(size_type _Off = 0,size_type _Count = npos) const;
參數(shù)
_Off:所需的子字符串的起始位置悬而。默認(rèn)值為0.
_Count:復(fù)制的字符數(shù)目。如果沒有指定長(zhǎng)度_Count或_Count+_Off超出了源字符串的長(zhǎng)度锭汛,則子字符串將延續(xù)到源字符串的結(jié)尾笨奠。
返回值
一個(gè)子字符串,從其指定的位置開始
(4)C++字符串與C語言字符串之間的互相轉(zhuǎn)化
C++中有string類型唤殴,C語言中沒有string類型般婆。若要把C++中的string類型轉(zhuǎn)化為C語言中的string類型,必須用c_str()函數(shù)眨八。
#include <iostream>
using namespace std;
int main()
{
string s = "hello";
const char *s1 = s.c_str();
cout << s1 << endl;
return 0;
}
反過來腺兴,若C語言中的字符串要轉(zhuǎn)化為C++中的string類型,直接賦值即可
#include <iostream>
using namespace std;
int main()
{
const char *a = "Hi";
string s = a;
cout << s << endl;
return 0;
}
(5)atoi
atoi為C語言中的字符串轉(zhuǎn)化為整型的函數(shù)廉侧。若要轉(zhuǎn)化C++中的字符串页响,要先用c_str()轉(zhuǎn)化為C語言的字符串,才能使用atoi段誊。
atoi聲明于<stdlib.h>或<cstdlib>中闰蚕。
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
string s = "23";
int a = atoi(s.c_str());
cout << a << endl;
return 0;
}
反過來,有個(gè)整型轉(zhuǎn)換為字符串的函數(shù)叫itoa连舍,這個(gè)不是標(biāo)準(zhǔn)函數(shù)没陡,有些編譯器不支持。
二索赏、split()實(shí)現(xiàn)
令人遺憾的是盼玄,C++標(biāo)準(zhǔn)庫STL中沒有提供分割字符串的函數(shù),所以只能自己實(shí)現(xiàn)一個(gè)潜腻。
#include<iostream>
#include<vector>
#include<cstdlib>
using namespace std;
// 這里&是引用埃儿,不是取地址符
vector<string> split(const string &s, const string &separator)
{
vector<string> v;
string::size_type beginPos, sepPos;
beginPos = 0;
sepPos = s.find(separator);
while(string::npos != sepPos)
{
v.push_back(s.substr(beginPos, sepPos - beginPos));
beginPos = sepPos + separator.size();
sepPos = s.find(separator, beginPos);
}
if(beginPos != s.length())
{
v.push_back(s.substr(beginPos));
}
return v;
}
int main()
{
string s = "1 22 333";
// 因?yàn)閰?shù)separator是string類型,所以這里只能用" "融涣,不能用' '
vector<string> vec = split(s, " ");
vector<string>::iterator it;
for(it = vec.begin(); it != vec.end(); it++)
{
// 輸出字符串
cout << (*it) << endl;
// 輸出整數(shù)
cout << atoi((*it).c_str()) << endl;
}
}
運(yùn)行結(jié)果:
1
1
22
22
333
333
加入少兒信息學(xué)奧賽學(xué)習(xí)QQ群請(qǐng)掃左側(cè)二維碼童番,關(guān)注微信公眾號(hào)請(qǐng)掃右側(cè)二維碼