在C++中,常常需要对字符串进行分隔,可以使用string里的 substring()+Find() 的方式进行分隔,也可以使用 sscanf()、swscanf() 的方式进行分隔。具体如下:
对比 | substr | sscanf | swscanf |
---|---|---|---|
需要索引 | 是 | 否 | 否 |
字符类型 | ASCII字符 | ASCII字符 | wchar_t宽字符 |
空格截断 | 无 | 有 | 有 |
比如,从str1 = “11_ZhongYue_SongShan_1491meter”,str2="12_DongYue TaiShan 1532meter"这2个字符串里,提取索引号、山岳信息,效果如下:
可以看到, substr()、sscanf()、swscanf()这3个库函数,在提取字符串方面是等价的。
1 使用substr()提取
// Use_substr()函数
//使用substr()库函数提取字符串
void Use_SubStr(const string& strA,const string& strB)
{
//1)使用substr()
//提取序号、山岳
string indexArray[2], yue[2];
indexArray[0] = strA.substr(0, 2);
indexArray[1] = strB.substr(0, 2);
yue[0] = strA.substr(3, 8); //从索引3开始,截取8个字符串
yue[1] = strB.substr(3, 7); //从索引号3开始,截取7个字符串
for (int i = 0; i < 2; i++)
{
cout << "index= " << indexArray[i]<<", "<<yue[i]<<endl;
}
}
2 使用sscanf()提取
// Use_sscanf()函数
//使用sscanf()库函数提取字符串
void Use_sscanf(const string& strA, const string& strB)
{
//2)使用sscanf() 提前序号、山岳
const char* chArray[2];
chArray[0] = strA.c_str();
chArray[1] = strB.c_str();
char chA1[100];
char chB1[100];
int num[2];
sscanf(chArray[0], "%d_%[^_]", &num[0], chA1); //%[^_]表示截取以下划线结尾的字符串;
sscanf(chArray[1], "%d_%[^ ]", &num[1], chB1); //%[^ ]表示截取以空格结尾的字符串;
cout << "index= " << num[0] << ", " << chA1 << endl;
cout << "index= " << num[1] << ", " << chB1 << endl;
}
3 使用swscanf()提取
// Use_swscanf()函数
//使用swscanf()库函数提取字符串
void Use_swscanf(const wstring& strC, const wstring& strD)
{
//3)使用swscanf() 提取序号、山岳
const wchar_t* tchArry[2];
tchArry[0] = strC.c_str();
tchArry[1] = strD.c_str();
wchar_t tchC1[100], tchD1[100];
int tNum[2];
swscanf(tchArry[0], L"%d_%[^_]", &tNum[0], tchC1);
swscanf(tchArry[1], L"%d_%[^ ]", &tNum[1], tchD1);
wcout << "index= " << tNum[0] << ", " << tchC1 << endl;
wcout << "index= " << tNum[1] << ", " << tchD1 << endl;
}
4 主函数
//主函数: main()
int main() {
string strA = "11_ZhongYue_SongShan_1491meter"; //下划线分隔
string strB = "12_DongYue TaiShan 1532meter"; //下划线+空格分隔
wstring strC = L"11_ZhongYue_SongShan_1491meter";
wstring strD = L"12_DongYue TaiShan 1532meter";
cout << "--- 1)use substr ----" << endl;
Use_SubStr(strA, strB);
cout << "\r\n--- 2)use sscanf ----"<<endl;
Use_sscanf(strA, strB);
cout << "\r\n--- 3)use swscanf ----" << endl;
Use_swscanf(strC, strD);
system("pause");
return 0;
}
5 完整代码
//strSplit.cpp
#include <iostream>
#include<string>
#include <vector>
#include <iterator>
using namespace std;
#pragma warning(disable:4996)
//使用substr()库函数提取字符串
void Use_SubStr(const string& strA,const string& strB)
{
//1)使用substr()
//提取序号、山岳
string indexArray[2], yue[2];
indexArray[0] = strA.substr(0, 2);
indexArray[1] = strB.substr(0, 2);
yue[0] = strA.substr(3, 8); //从索引3开始,截取8个字符串
yue[1] = strB.substr(3, 7); //从索引号3开始,截取7个字符串
for (int i = 0; i < 2; i++)
{
cout << "index= " << indexArray[i]<<", "<<yue[i]<<endl;
}
}
//使用sscanf()库函数提取字符串
void Use_sscanf(const string& strA, const string& strB)
{
//2)使用sscanf() 提前序号、山岳
const char* chArray[2];
chArray[0] = strA.c_str();
chArray[1] = strB.c_str();
char chA1[100];
char chB1[100];
int num[2];
sscanf(chArray[0], "%d_%[^_]", &num[0], chA1); //%[^_]表示截取以下划线结尾的字符串;
sscanf(chArray[1], "%d_%[^ ]", &num[1], chB1); //%[^ ]表示截取以空格结尾的字符串;
cout << "index= " << num[0] << ", " << chA1 << endl;
cout << "index= " << num[1] << ", " << chB1 << endl;
}
//使用swscanf()库函数提取字符串
void Use_swscanf(const wstring& strC, const wstring& strD)
{
//3)使用swscanf() 提取序号、山岳
const wchar_t* tchArry[2];
tchArry[0] = strC.c_str();
tchArry[1] = strD.c_str();
wchar_t tchC1[100], tchD1[100];
int tNum[2];
swscanf(tchArry[0], L"%d_%[^_]", &tNum[0], tchC1);
swscanf(tchArry[1], L"%d_%[^ ]", &tNum[1], tchD1);
wcout << "index= " << tNum[0] << ", " << tchC1 << endl;
wcout << "index= " << tNum[1] << ", " << tchD1 << endl;
}
int main() {
string strA = "11_ZhongYue_SongShan_1491meter"; //下划线分隔
string strB = "12_DongYue TaiShan 1532meter"; //下划线+空格分隔
wstring strC = L"11_ZhongYue_SongShan_1491meter";
wstring strD = L"12_DongYue TaiShan 1532meter";
cout << "--- 1)use substr ----" << endl;
Use_SubStr(strA, strB);
cout << "\r\n--- 2)use sscanf ----"<<endl;
Use_sscanf(strA, strB);
cout << "\r\n--- 3)use swscanf ----" << endl;
Use_swscanf(strC, strD);
system("pause");
return 0;
}