一、ASCII码
1.常用:'A' - 'Z' 是 65 - 90,'a' - 'z' 是 97 - 122, '0' - '9' 是 48 - 57。
2.字符可以运算, 运算时会将其当作整数。
二、字符数组
字符输入输出
1.字符串就是字符数组加上结束符’\0’。
2.可以使用字符串来初始化字符数组,但此时要注意每个字符串结尾会含一个’\0’字符,因此字符数组的长度至少要比字符串的长度多1!
3.读入一个字符串时使用cin / scanf, 但两者无法读入空格与换行符, 如果要读入换行符, 使用gets(str), 但新版C++因为安全性不再支持puts, 建议使用fgets(str, 长度, stdin)。
[stdin] 已配好的文件,不需要管是什么
4.输出就和普通的输出一样就可以了。
字符数组常用操作
1.需要引入头文件#include<cstring>。
2.(1) strlen(str),求字符串的长度
(2) strcmp(a, b),比较两个字符串的大小,a < b 返回-1,a == b 返回0,a > b返回1。这里的比较方式是字典序!
(3) strcpy(a, b),将字符串b复制给从a开始的字符数组。
3.遍历时最好不要写for(int i = 0; i < strlen(str); i ++) 因为strlen()这个函数也会遍历一遍字符数组, 可以在循环外开变量先存长度
三、标准库类型string
定义和初始化
1.需要头文件#include<string>。
2.定义时直接string str;就可以了。
3.初始化直接 = "字符串" 就可以了。
string上的读写
1.C与C++普通的读写均支持,但printf()时必须写成 printf(“%s”, s.c_str());。
2.使用getline读取一整行getline(cin, str);。
string的其他常用操作
1.srt.empty()如果字符串为空返回ture, 反之则返回false。
2.str.size()返回字符串的长度。
3.字符串之间的比较如 == > < 等操作均可进行, 按字典序进行比较。
4.给字符串赋值和给其他变量赋值类似。
5.关于string的加法,两string对象相加在前一个末尾补上, string加字符或是字面值必须保证一个对象时string, 其他的变量会转化为string对象。
6.关于str.substr(起始位, 中止位);返回之间的一段字符串。
处理string对象的字符
1.可以和处理字符数组中的字符一样用循环处理。
2.基于范围的for语句for(char c : str) cout << c << endl; for(char &c : str) c = 'a';
四、练习题
T1
给定一行长度不超过 100100 的非空字符串,请你求出它的具体长度。
输入格式
输入一行,表示一个字符串。注意字符串中可能包含空格。
输出格式
输出一个整数,表示它的长度。
数据范围
1≤字符串长度≤1001≤字符串长度≤100 字符串末尾无回车
输入样例:
I love Beijing.
输出样例:
15
代码
#include<string> #include<iostream> using namespace std; int main() { string str; getline(cin, str); cout << str.size(); return 0; }
T2
输入一行字符,长度不超过 100100,请你统计一下其中的数字字符的个数。
输入格式
输入一行字符。注意其中可能包含空格。
输出格式
输出一个整数,表示数字字符的个数。
输入样例:
I am 18 years old this year.
输出样例:
2
代码
#include<iostream> using namespace std; int main() { string str; getline(cin, str); int num = 0; for(char c: str) { if(c >= 48 && c <= 57) num ++; } cout << num; return 0; }
T3
循环相克令是一个两人玩的小游戏。
令词为“猎人、狗熊、枪”,两人同时说出令词,同时做出一个动作——猎人的动作是双手叉腰;狗熊的动作是双手搭在胸前;枪的动作是双手举起呈手枪状。
双方以此动作判定输赢,猎人赢枪、枪赢狗熊、狗熊赢猎人,动作相同则视为平局。
现在给定你一系列的动作组合,请你判断游戏结果。
输入格式
第一行包含整数 T,表示共有 T组测试数据。
接下来 T 行,每行包含两个字符串,表示一局游戏中两人做出的动作,字符串为 Hunter
, Bear
, Gun
中的一个,这三个单词分别代表猎人,狗熊和枪。
输出格式
如果第一个玩家赢了,则输出 Player1
。
如果第二个玩家赢了,则输出 Player2
。
如果平局,则输出 Tie
。
数据范围
1≤T≤100
输入样例
3 Hunter Gun Bear Bear Hunter Bear
输出样例
Player1 Tie Player2
代码
#include<iostream> #include<string> using namespace std; int thenum(string str) { if(str == "Hunter") return 0; if(str == "Bear") return 1; if(str == "Gun") return 2; } int main() { int T; cin >> T; while(T --) { string a, b; cin >> a >> b; int player1 = thenum(a), player2 = thenum(b); if(player1 == player2) cout << "Tie\n"; else if(player1 == (player2 + 1) % 3) cout << "Player1\n"; else cout << "Player2\n"; } return 0; }
T4
给定一个字符串,在字符串的每个字符之间都加一个空格。
输出修改后的新字符串。
输入格式
共一行,包含一个字符串。注意字符串中可能包含空格。
输出格式
输出增加空格后的字符串。
数据范围
1≤字符串长度≤1001≤字符串长度≤100
输入样例:
test case
输出样例:
t e s t c a s e
代码
#include<iostream> #include<string> using namespace std; int main() { string a, b; getline(cin, a); for(char c: a) b = b + c + ' '; cout << b; return 0; }
T5
给定一个由大小写字母构成的字符串。
把该字符串中特定的字符全部用字符 #
替换。
请你输出替换后的字符串。
输入格式
输入共两行。
第一行包含一个长度不超过 3030 的字符串。
第二行包含一个字符,表示要替换掉的特定字符。
输出格式
输出共一行,为替换后的字符串。
输入样例:
hello l
输出样例:
he##o
代码
#include<iostream> #include<string> using namespace std; int main() { string a; getline(cin, a); char b; cin >> b; for(char &c: a) { if(c == b) c = '#'; } cout << a; return 0; }
T6
有两个不包含空白字符的字符串 str 和 substr,str的字符个数不超过 1010,substr 的字符个数为 33。(字符个数不包括字符串结尾处的 \0
。)
将 substr 插入到 str 中 ASCII 码最大的那个字符后面,若有多个最大则只考虑第一个。
输入格式
输入包括若干行,每一行为一组测试数据,格式为
str substr
输出格式
对于每一组测试数据,输出插入之后的字符串。
输入样例:
abcab eee 12343 555
输出样例:
abceeeab 12345553
代码
#include<iostream> #include<string> using namespace std; int main() { string a, b; while(cin >> a >> b) { string res; for(char c: a) { int check = 1; for(char d: a) { if(d > c) check = 0; } if(check) res = res + c + b; else res = res + c; } cout << res << endl; } return 0; }