首页 > 技术文章 > 第7周

VincentValentine 2016-07-14 18:17 原文

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 }

 

 

推荐阅读