2.1字符串处理
c风格字符串
scanf和sprintf
- 定义:
sscanf(s,"%d",&n);//把字符串s转换为数字n
printf(s,"%d",n);//把数字转化为字符串
- 如何理解:
- sscanf相当于为把输入的数字当作字符串进行处理做准备
- sprintf相当于准备把数字当成字符串进行输出
- 用法与scanf,printf相似
char类型字符串的输入输出规则
- getchar,cin, scanf可读入一个字符
- cin,scanf遇到空格和换行符停止
- gets遇空格不停,一直读到本行结束
- 可通过循环getchar()的方式在合适时终止读入,是读入优化的基本写法
scanf和cin的无限输入
while(scanf()!=EOF)或while(cin>>...)
手动输入ctrl+Z终止
string类型字符串
#include<string>
!!与<cstring>不同!!
定义
string str;
用法与普通变量相似
输入输出
cin>>,cout<<
遇到空格换行停止
- 整行输入使用
getline(cin,str);
常用操作
- 普通类
- 函数
- 类型转换
- 一些有趣的赋值操作:
string str1("ni ");
string str2("hao\n");
str1+=str2;//str1为“ni hao\n”
- 注意:~~str1="ni "+“hao\n”;~~非法,但str1="ni "+str2;合法
例题:
2.1-b位移包含
要点:
- 字符串的位移
l=str1.length()-1;//注意打括号
char z=str1[0];
str1=str1.substr(1,l);//相当于str1.erase(0,1);
str1+=z;//别忘了
- 查找子串:
str1.find(str2,0);//寻找从下标0开始str2第一次出现的位置
- 如未找到返回string::npos
- 代码
#include <bits/stdc++.h>
using namespace std;
string str1, str2;
int main() {
cin >> str1 >> str2;
if (str1.length() < str2.length())
swap(str1, str2);
int l = str1.length() - 1;
for (int i = 0; i <= l; i++) {
char z = str1[0];
str1 = str1.substr(1, l);
str1 += z;
if (str1.find(str2, 0) != string::npos) {
cout << "true" << endl;
return 0;
}
}
cout << "false" << endl;
return 0;
}
2.1-c单词替换
要点:
- 防止查找到的是单词而不是子串,先在单词前后加上空格再进行查找
- 在string类型字符串前后加空格是要加字符的空格:“ ”
- 每次以一个单词为单位输入,并在前后加空格
代码
#include<bits/stdc++.h>
using namespace std;
string s,a,b,str[105];//str用于储存每个单词,便于输入
char space;
int n;
int main(){
do{
n++;
cin>>str[n];//输入一个单词(字符组)
s=s+str[n];
s=s+" ";
scanf("%c",&space);
}while(space==' ');
s=" "+s;
cin>>a;a=" "+a+" ";
cin>>b;b=" "+b+" ";
int len = a.length(),k=s.find(a,0),l=k;
while(k!=string::npos){
s.erase(k,len);
s.insert(k,b);
k=s.find(a,l+1);
l=k;
}
cout<<s.substr(1,s.length()-1)<<endl;
return 0;
}