文章目录
#关于字符串的输入输出
这些是会用到的
只要知道两个就够了(大部分题目要求不高)
一个是string
,一个是char c[N];
- 这是
string
类型的
//这样遇到空格就会结束(空格会被读进到最后一位。)
string s;
cin >> s;
//这样写会计入空格,输入换行才会结束。而且不会把换行读进去!!!!
getline(cin,a);
- 这是
char
类型的
//从第n位开始记录
//注意这里不要加&
char str[N];
scanf("%s", str + n);
//第二种方法:
//可以读进去空格,遇到换行不会读进去,并结束。
gets(str);
string输入例子
一、括号树
重点:
题目描述:第二行一个长为 n 的由 ( 与 ) 组成的括号串,第 i 个括号表示 i 号结点上的括号。
也就是输入了一串字符串,用char str[N];
定义,scanf("%s", str + 1);
输入
char str[N];
int main()
{
……
scanf("%s", str + 1);
……
return 0;
}
#字符串处理(这是某张学案上的知识点)
字符串处理是竞赛中的常见题目,除了简单的字符串查找、替换、匹配等问题以外,还有比较复杂的字符串算法,其中应用广泛的有字符串哈希、KMP、字典树(Trie Tree),AC自动机和后缀数组等。
字符串基本操作
读入
查找
替换
截取
数字和字符串转换
读入gets()
和getchar();
读字符:char ch1;ch1=getchar();
读字符串:char str[1002];gets(str);
String类:string str; getline(cin,str);
POJ 3981 字符串替换
编写一个C++程序实现将字符串中的所有"you"替换成"we"
Input
输入包含多行数据
每行数据是一个字符串,长度不超过1000
数据以EOF结束
Output
对于输入的每一行,输出替换后的字符串
Sample Input
you are what you do
Sample Output
we are what we do
85 wind
83 memory
【C程序1】
下面的程序一次读取一个完整的字符串,用gets()函数实现。
在比赛中不建议使用gets()函数。
#include<cstdio>
char str[1002];
int main(){
int i;
while(gets(str)!=NULL){
for(int i=0;str[i]!='\0';i++){
if(str[i]=='y'&&str[i+1]=='o'&&str[i+2]=='u'){
printf("we");
i+=2;
}
else
printf("%c",str[i]);
}
printf("\n");
}
return 0;
}
【C程序2】
下面的程序一次只读一个字符,用getchar()函数实现。
这个程序比上一个程序要好,因为它不需要定义一个字符串数组,当然也不用考虑数组的大小。
#include<cstdio>
int main(){
char ch1,ch2,ch3;
while((ch1=getchar())!=EOF){
if(ch1=='y'){
if((ch2=getchar())=='o'){
if((ch3=getchar())=='u')
printf("we");
else
printf("yo%c",ch3);
}else
printf("y%c",ch2);
}
else
printf("%c",ch1);
}
return 0;
}
使用cin读入字符串时,遇到空白就停止读取,
有时我们想把一个句子存下来,又不想创建多个string来存储单词,怎么办?
那就用getline来获取一整行内容。
【C程序3】
下面的程序用到string类,getline()函数
#include<iostream>
#include<string>
using namespace std;
int main(){
string str;
int pos;
while(getline(cin,str)){
while((pos=str.find("you"))!=-1)
str.replace(pos,3,"we");
cout<<str<<endl;
}
return 0;
}
C++ STL中最基本以及最常用的类或容器无非就是以下几个:vector、set、list、map、String
用string初始化字符串分两类:用“=”号就是拷贝初始化,否则就是直接初始化。
使用const_iterator使得访问元素时是能读不能写,这跟常量指针意思差不多。
string str("hi you");
for (string::const_iterator it = str.begin(); it != str.end(); it++){
cout << *it << endl;
*it = 'k'; //这是错误的,不能写
}
C++ 字符串长度:
求字符串长度用
.size()
或者.length()
c++ 删除字符串指定位置的字符
string erase(int start, int len);
//start为要删除字符的起始位置(从0数起),len为要删除字符的个数。
截取子串
s.substr(pos, n)
//截取s中从pos开始(包括0)的n个字符的子串,并返回
s.substr(pos)
//截取s中从从pos开始(包括0)到末尾的所有字符的子串,并返回
替换子串
s.replace(pos, n, s1)
//用s1替换s中从pos开始(包括0)的n个字符的子串
查找子串
s.find(s1)
查找s中第一次出现s1的位置,并返回(包括0)
s.rfind(s1)
查找s中最后次出现s1的位置,并返回(包括0)
s.find_first_of(s1)
查找在s1中任意一个字符在s中第一次出现的位置,并返回(包括0)
s.find_last_of(s1)
查找在s1中任意一个字符在s中最后一次出现的位置,并返回(包括0)
s.fin_first_not_of(s1)
查找s中第一个不属于s1中的字符的位置,并返回(包括0)
s.fin_last_not_of(s1)
查找s中最后一个不属于s1中的字符的位置,并返回(包括0)
字符串基本操作练习列表(是VJ上的题):
760 字符串长度 60.54% 简单
761 字符串中的数字个数 51.48% 简单
762 字符串匹配 25.98% 简单
763 循环相克令 42.67% 简单
764 输出字符串 31.50% 简单
765 字符串加空格 53.89% 简单
766 去掉多余的空格 66.67% 简单
767 信息加密 43.23% 简单
768 忽略大小写比较字符串大小 34.18% 简单
769 替换字符 72.00% 简单
770 单词替换 51.89% 中等
771 字符串中最长的连续出现的字符 60.00% 中等
772 只出现一次的字符 40.88% 中等
773 字符串插入 48.28% 中等
774 最长单词 52.03% 中等
775 倒排单词 81.82% 中等
776 字符串移位包含问题 44.23% 困难
777 字符串乘方 78.12% 困难
778 字符串最大跨距 37.86% 困难