• C++里sscanf()与swscanf()的使用


        在C++中,常常需要对字符串进行分隔,可以使用string里的 substring()+Find() 的方式进行分隔,也可以使用 sscanf()swscanf() 的方式进行分隔。具体如下:

    对比substrsscanfswscanf
    需要索引
    字符类型ASCII字符ASCII字符wchar_t宽字符
    空格截断

        比如,从str1 = “11_ZhongYue_SongShan_1491meter”,str2="12_DongYue TaiShan 1532meter"这2个字符串里,提取索引号山岳信息,效果如下:

    图(1) 提取指定的字符串

        可以看到, 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;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    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;
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    5 完整代码

        //strSplit.cpp

    #include 
    #include
    #include 
    #include 
    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;
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
  • 相关阅读:
    红米k40s和红米note11pro哪个值得买 两者配置对比
    string类的常用方法
    CompletableFuture异步回调
    Android消息机制(Handler、Looper、MessageQueue)
    一次请求的来龙去脉 - Tomcat架构解析(二)
    Redis 与 MySQL 一致性 实现方案
    使用 uni-app 开发项目,日期和时间如何格式化?
    微擎模块 柚子抽奖平台1.2.6 后台模块+前端小程序源码 增加发布抽奖图片自定义
    三角函数概述
    vue3 tsx语法
  • 原文地址:https://blog.csdn.net/sanqima/article/details/126554202