7.1 字符串
1.字符串有三种形式:
(1)用双引号括起来的字符串常量。 eg. "CHINA", "C++ Program"
(2)存放于字符数组中,以'\0'字符(ASCII码为0)结尾。
(3)string对象。
2.字符串常量占据内存的字节数等于字符串中字符数目+1,多出来的是结尾字符'\0',字符串的长度不包括'\0'。
3.""也是合法的字符串常量,称为空串,仍然会占据一个字节的存储空间存放'\0'。
4.如果字符串常量中包含双引号,则双引号应写为'\"'。而'\'字符在字符串中出现时应写为'\\'。
eg. cout << "He said:\"I am a stu\\dent.\""; -> He said:"I am a stu\dent."
5.包含'\0'字符的一维char数组,就是一个字符串,存放时数组元素个数至少为字符串长度+1。用cin、scanf将字符串读入字符数组时,会自动在末尾加上'\0'。
6.用scanf读入时到空格为止,数组长度不足的情况下,可能导致数组越界。
7.cin.getline(char buf[], int bufsize); 读入一行(行长度不超过bufsize-1)或bufsize-1个字符到buf,自动添加'\0',回车换行符不会写入buf而是从输入流中去掉。
8.gets(char buf[]); 读入一行,自动添加'\0',回车换行符不会写入buf而是从输入流中去掉,可能导致数组越界。
9.字符串函数都根据'\0'来判断字符串结尾,形参为char []类型时,实参可以是char数组或字符串常量。
10.strlen函数的执行是需要时间的,且时间和字符串的长度成正比。可以取出s的长度存放在一个变量里面。
eg.int len = strlen(s); 或 for(int i=0; s[i]; i++);
作业
1.统计数字字符个数
Description:输入一行字符,统计出其中数字字符的个数。
Input:一行字符串,总长度不超过255。
Output:输出为1行,输出字符串里面数字字符的个数。
Sample Input:Peking University is set up at 1898.
Sample Output:4
1 #include <cstdio>
2
3 #define maxn 255
4 char str[maxn+10];
5
6 int main()
7 {
8 //freopen("D:\\temp\\test\\tmp.txt", "r", stdin);
9
10 gets(str);
11 int counter = 0;
12 for(int i=0; str[i]; i++) {
13 if(str[i]>='0' && str[i]<='9')
14 counter++;
15 }
16
17 printf("%d\n", counter);
18
19 return 0;
20 }
2.找到第一个只出现一次的字符
Description:给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。如果没有,输出no。
Input:一个字符串,长度小于100000。
Output:输出第一个仅出现一次的字符,若没有则输出no。
Sample Input:abcabd
Sample Output:c
1 #include <cstdio>
2
3 #define maxn 100000
4 char str[maxn+10];
5
6 int main()
7 {
8 //freopen("D:\\temp\\test\\tmp.txt", "r", stdin);
9
10 gets(str);
11
12 bool flag = false;
13 const int num = 26;
14 int arr[num] = {0};
15 for(int i=0; str[i]; i++) {
16 arr[str[i]-'a']++;
17 }
18 for(int i=0; str[i]; i++) {
19 if(arr[str[i]-'a'] == 1) {
20 printf("%c\n", str[i]);
21 flag = true;
22 break;
23 }
24 }
25 if(flag == false)
26 printf("no\n");
27
28 return 0;
29 }
3.石头剪子布
Description:
石头剪子布,是一种猜拳游戏。起源于中国,然后传到日本、朝鲜等地,随着亚欧贸易的不断发展它传到了欧洲,到了近现代逐渐风靡世界。简单明了的规则,使得石头剪子布没有任何规则漏洞可钻,单次玩法比拼运气,多回合玩法比拼心理博弈,使得石头剪子布这个古老的游戏同时用于“意外”与“技术”两种特性,深受世界人民喜爱。 游戏规则:石头打剪刀,布包石头,剪刀剪布。 现在,需要你写一个程序来判断石头剪子布游戏的结果。
Input:
输入包括N+1行:第一行是一个整数N,表示一共进行了N次游戏。1 <= N <= 100。
接下来N行的每一行包括两个字符串,表示游戏参与者Player1,Player2的选择(石头、剪子或者是布):S1 S2
字符串之间以空格隔开S1,S2只可能取值在{"Rock", "Scissors", "Paper"}(大小写敏感)中。
Output:输出包括N行,每一行对应一个胜利者(Player1或者Player2),或者游戏出现平局,则输出Tie。
Sample Input:
3
Rock Scissors
Paper Paper
Rock Paper
Sample Output:
Player1
Tie
Player2
1 #include <cstdio>
2
3 #define num 10
4
5 int main()
6 {
7 //freopen("D:\\temp\\test\\tmp.txt", "r", stdin);
8
9 int n;
10 char str1[num], str2[num];
11 scanf("%d", &n);
12 for(int i=0; i<n; i++) {
13 scanf("%s %s", str1, str2);
14 if(str1[0] == 'R') {
15 if(str2[0] == 'S')
16 printf("Player1\n");
17 else if(str2[0] == 'P')
18 printf("Player2\n");
19 else
20 printf("Tie\n");
21 }
22 else if(str1[0] == 'S') {
23 if(str2[0] == 'R')
24 printf("Player2\n");
25 else if(str2[0] == 'P')
26 printf("Player1\n");
27 else
28 printf("Tie\n");
29 }
30 else {
31 if(str2[0] == 'S')
32 printf("Player2\n");
33 else if(str2[0] == 'R')
34 printf("Player1\n");
35 else
36 printf("Tie\n");
37 }
38 }
39
40 return 0;
41 }
4.最长最短单词
Description:
输入1行句子(不多于200个单词,每个单词长度不超过100),只包含字母、空格和逗号。单词由至少一个连续的字母构成,空格和逗号都是单词间的间隔。
试输出第1个最长的单词和第1个最短单词。
Input:一行句子。
Output:两行输出:第1行,第一个最长的单词。第2行,第一个最短的单词。
Sample Input:I am studying Programming language C in Peking University
Sample Output:
Programming
I
1 #include<cstdio>
2 #include<cstring>
3
4 int main()
5 {
6 //freopen("D:\\temp\\test\\tmp.txt", "r", stdin);
7
8 char a[20005], b[105], maxT[105]="" , minT[105]="";
9 int i = 0, j = 0, f = 0;
10 int max = -1, min = 105, newLen;
11
12 gets(a);
13 while(a[i] != '\0')
14 {
15 if(a[i]==' ' || a[i]==',')
16 {
17 if(f == 1)
18 {
19 b[j]='\0';
20 newLen = strlen(b);
21 if(newLen > max) {
22 max = newLen;
23 strcpy(maxT, b);
24 }
25 if(newLen < min) {
26 min = newLen;
27 strcpy(minT, b);
28 }
29 f = 0;
30 j = 0;
31 }
32 }
33 else
34 {
35 b[j++] = a[i];
36 f = 1;
37 }
38 i++;
39 }
40
41 b[j] = '\0';
42 newLen = strlen(b);
43 if(newLen > max) {
44 max = newLen;
45 strcpy(maxT, b);
46 }
47 if(newLen < min) {
48 min = newLen;
49 strcpy(minT, b);
50 }
51
52 printf("%s\n%s\n", maxT, minT);
53
54 return 0;
55 }
5.密码翻译
Description:
在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密,简单的加密算法虽然不足以完全避免情报被破译,但仍然能防止情报被轻易的识别。我们给出一种最简的的加密方法,对给定的一个字符串,把其中从a-y,A-Y的字母用其后继字母替代,把z和Z用a和A替代,其他非字母字符不变,则可得到一个简单的加密字符串。
Input:输入一行,包含一个字符串,长度小于80个字符。
Output:输出每行字符串的加密字符串。
Sample Input:Hello! How are you!
Sample Output:Ifmmp! Ipx bsf zpv!
1 #include <cstdio>
2
3 #define num 80
4 char s[num+10];
5
6 int main()
7 {
8 //freopen("D:\\temp\\test\\tmp.txt", "r", stdin);
9
10 gets(s);
11
12 for(int i=0; s[i]; i++) {
13 if(s[i]>='a'&&s[i]<='y' || s[i]>='A'&&s[i]<='Y')
14 s[i] += 1;
15 else if(s[i] == 'z')
16 s[i] = 'a';
17 else if(s[i] == 'Z')
18 s[i] = 'A';
19 }
20
21 puts(s);
22
23 return 0;
24 }