头文件:
#include <cstring>
#include <sstream>
题目未给定数据个数,一般多在模拟题用到
string str;
getchar(); //如果getline()之前已经读入过其他数据,需要用getchar()读掉前面剩下的回车
getline(cin, str); //读入一整行
stringstream ssin(str); //从字符串中读入数据(这里变量名可以随便取,这里取名为ssin)
while(ssin >> str) //这样可以做到从字符串中读入数据
统计输入的字符串个数:
string strs[N];
int n = 0;
while(cin >> strs[n]) n ++ ;
string常用函数
string str;
find();
str.find('x'); //从一个string类型中找某个字符,找不到返回-1,找到返回第一次出现下标
find()函数也可以找字符串
如果要查找字符串y中是否包含字符串x,可以写成:
if(y.find(x) != -1) //此时y中包含x
substr(); //用来返回string字符串的子串
//可以写两个参数,也可写一个
str.substr(1, 3); //返回下标从1开始,长度为3的str的子串
str.substr(1); //返回下标从1开始直到结尾的str的子串
str.c_str(); //string变成字符数组char[]
str.back(); //末尾字符
str.pop_back(); //去掉末尾字符
str.size(); //string字符串长度
strstr(str1,str2)
函数
用于判断字符串str2
是否是str1
的子串。
如果是,则该函数返回str2
在str1
中首次出现的地址;否则,返回NULL
。
strstr(str1, str2);
注意这里的str1和str2必须为char[]类型,不能是string(因为strstr是C语言的函数)
char str1[] = "1234xyz";
char str2[] = "34";
if(strstr(str1, str2)) cout << strstr(str1, str2);
else cout << "null";
上面的结果为34xyz
,即它把首次出现的位置到结尾全部输出了。
如果使用string
,可以先用c_str()
函数将string转换为char[]
再调用strstr()
string a, b;
cin >> a >> b;
if(strstr(a.c_str(), b.c_str())) puts("Yes"); //如果b是a的子串
else puts("No");
也可以手写string版本的strStr函数(KMP板子)
void strStr(string s, string p)
{
int n = s.size(), m = p.size();
s = ' ' + s, p = ' ' + p;
for (int i = 2, j = 0; i <= m; i++)
{
while (j && p[i] != p[j + 1]) j = ne[j];
if (p[i] == p[j + 1]) j++;
ne[i] = j;
}
for (int i = 1, j = 0; i <= n; i++)
{
while (j && s[i] != p[j + 1]) j = ne[j];
if (s[i] == p[j + 1]) j++;
if (j == m) printf("%d ", i - m); //匹配成功
}
}
字符串与数字的转换
string str;
stoi(str); //string to int
stoll(str); //string to long long
stof(str); //string to float
stod(str); //string to double
char s[N]; //字符数组
atoi(s); //a to int,将char数组变成int
atod(s); //a to double
atoll(s); //a to long long
字符函数(参数是字符char)
isdigit(); //是数字,返回true
isalpha(); //如果是字母,返回true
isalnum(); //如果是字母或数字,返回true
islower(); //是小写字母,返回true
isupper(); //是大写字母,返回true
tolower(); //如果是大写,返回其小写
toupper(); //如果是小写,返回其大写
ispunct(); //如果是标点符号,返回true
isspace(); //如果是空白字符,包括空格、换行符、回车、制表符等,返回true
isxdigit(); //如果是16进制数,返回true,如0-9、a-f、A-F
还有两个使用频率相对来说较少的
sscanf(); //也是从字符串中读入数据,这个一般用于日期类模拟题,输入的是固定格式的日期
例子:
这题的输入格式为:yyyymmddHHMM(年、月、日、小时、分钟)
Timer(string str)
{
sscanf(str.c_str(), "%04d%02d%02d%02d%02d", &year, &month, &day, &hour, &minute);
}
sprintf(); //将数据输出到字符串中
例子:
string to_string()
{
char str[20];
sprintf(str, "%04d%02d%02d%02d%02d", year, month, day, hour, minute);
return str;
}
上面的例子来源于AcWing 3254. Crontab ,代码:这里
两个优化技巧:
1.非递归函数前加inline
2.变量名前加register
%%%
%%%
%