方法一:sscanf函数
sscanf函数
- 处理字符串时,经常需要从整串字符串中截取我们需要的数据,这时sscanf就派上用场了。
- 定义函数 int sscanf (const char * str,const char * format,……..); sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结果存于对应的参数内。成功则返回参数数目,失败则返回-1。
- 程序运行时出现sscanf不安全错误,加入#define _CRT_SECURE_NO_WARNINGS
- 简单使用
#define _CRT_SECURE_NO_WARNINGS //避免不安全错误
#include<iostream>
#include<vector>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc, char* argv[]) {
string s1;
sscanf("123456", "%4s", s1); //取指定长度的字符串
printf("s1=%s\n", s1); //s1=1234
string s2;
sscanf("192453。2322", "%[^。]", s2); //取到指定字符为止的字符串,取遇到句号截止字符串
printf("s2=%s\n", s2); //s2=192453
string s3;
sscanf("123adADWbs89", "%[1-9a-z]", s3); //取仅包含指定字符集的字符串,遇到不符合的字符立即停止
printf("s3=%s\n", s3); //s3=123ad
string s4;
sscanf("BCD123abc", "%[^a-z]", s4); //取到指定字符集为止的字符串
printf("s4=%s\n", s4); //s4=BCD123
vector<int> vec(4);
sscanf("192.168.0.1", "%d.%d.%d.%d", &vec[0], &vec[1], &vec[2], &vec[3]);
cout << vec[0] << " " << vec[1] << " " << vec[2] << " " << vec[3] << endl; //192 168 0 1
getchar();
return 0;
}
c_str函数
- 语法:const char * c_str();返回一个指向正规C字符串的指针常量, 内容与本string串相同。
data函数
- 语法:const char * c_str();返回一个指向正规C字符串的指针常量, 内容与本string串相同。
比较程序
- 将两个IP地址以’.’分割成int型数据存放在vector中,对两个vector中的数据逐个比较大小。
- 缺点:sscanf函数要只要分割’.’的个数。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
int main(int argc, char* argv[]) {
string str1 = "192.168.0.1";
string str2 = "192.168.0.2";
vector<int> vec1(4);
sscanf(str1.c_str(), "%d.%d.%d.%d", &vec1[0], &vec1[1], &vec1[2], &vec1[3]);
vector<int> vec2(4);
sscanf(str2.c_str(), "%d.%d.%d.%d", &vec2[0], &vec2[1], &vec2[2], &vec2[3]);
for (auto i = 0; i < vec1.size(); ++i) {
if (vec1[i] > vec2[i]) {
cout << "str1>str2" << endl;
break;
}else if(vec1[i]<vec2[i]){
cout << "str2>str1" << endl;
break;
}
}
getchar();
return 0;
}
方法二:strtok函数
函数原型
- char* strtok (char* str,const char* delimiters );
- str:strtok函数在第一次调用时传入需要被切割字符串的首地址;之后传入nullptr。
- delimiters:分隔符集合。以delimiters为切割字符对str进行切割。
函数作用
- 第一次调用strtok函数时,这个函数将忽略分隔符,返回str首地址(首地址到第一个分割符之间的子串),之后以分隔符作为标志,返回分隔符的下一个字符指针(两个分割符之间的子串 / 分割符与’\0’之间的子串),直到遇到’\0’停止。
使用时需要包含头文件“string.h”
程序运行时出现不安全错误,加入#define _CRT_SECURE_NO_WARNINGS
注意
- string 转 const char*:str.c_str()或者str.data()
- const char* 转 char*:strcpy() 或者 const_cast<类型>
- const_cast是一种C++运算符,主要是用来去除复合类型中const和volatile属性。
- 用法:const_cast<类型>(expression)。通过const_cast运算符,也只能将const type*转换为type*,将const type&转换为type&。
string str1 = "192.168.0.1";
const char* result = str1.c_str(); //使用c_str()函数
//const char* result = strcpy(C, str1.data()); //或者使用data()函数
char C[20];
strcpy(C, str1.c_str()); //使用strcpy()函数
//char* C = const_cast<char*>(str1.data());
- 程序实例
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
int main(int argc, char* argv[]) {
string str1 = "192.168.0.1";
char C[20];
strcpy(C, str1.c_str());
char* temp = strtok(C, "."); //第一次调用
vector<char*> vec1;
while (temp) {
vec1.push_back(temp);
temp = strtok(nullptr, "."); //后续调用
}
for (auto it : vec1) {
cout << it << endl;
}
getchar();
return 0;
}
//运行结果:192 168 0 1
strcmp函数
- 字符串比较函数。两个字符串自左向右逐个字符比较(按ASCII值比较),直到出现不同的字符或遇’\0’为止。
- 函数原型 int strcmp(char* c1,char* c2)
- 返回值:c1==c2,返回0;c1>c2,返回正数;c1 < c2,返回负数。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
void Split(vector<char*>& vec, char* str, const char* c) {
char* temp = strtok(str, c);
while (temp) {
vec.push_back(temp);
temp = strtok(nullptr, c);
}
}
int main(int argc, char* argv[]) {
string str1 = "192.168.0.1";
string str2 = "192.168.0.2";
char* s1 = const_cast<char*>(str1.data());
char* s2 = const_cast<char*>(str2.c_str());
vector<char*> vec1;
Split(vec1, s1, ".");
vector<char*> vec2;
Split(vec2, s2, ".");
int i = 0;
while (vec1.size() != i && vec2.size() != i) {
if (strcmp(vec1[i], vec2[i]) > 0) {
cout << "str1>str2" << endl;
getchar();
return 0;
}
else if (strcmp(vec1[i], vec2[i]) < 0) {
cout << "str1<str2" << endl;
getchar();
return 0;
}
++i;
}
if (vec1.size()!=vec2.size()) {
if(vec1.size()>vec2.size())
cout << "str1>str2" << endl;
else {
cout << "str1<str2" << endl;
}
}
else {
cout << "str1==str2" << endl;
}
getchar();
return 0;
}
//运行结果:str1<str2