📄 c.txt
字号:
24 {
25 head[i] = temp[i]; //从临时内存区复制尾部字符
26 }
27
28 free(temp);
29 }
30
31 int main(void)
32 {
33 char string[] = "123456789";
34 int steps = 0;
35
36 printf("string: %s\n", string);
37 printf("input step: ");
38 scanf("%d", &steps);
39 loopMove(string, steps); //向右循环移位
40 printf("after loopMove %d: %s\n", steps, string);
41
42 return 0;
43 }
程序执行结果如下所示:
string: 123456789
input step; 6(输入)
after loopMove 6: 456789123
程序中首先计算字符串尾部移到头部的字符个数,然后分配一个相同大小的堆内存来临时保存这些字符,最后做两次循环分别把头部字符移位到尾部以及把堆内存中的内容复制到字符串头部。
面试例题24:从字符串的指定位置开始,删除其指定长度字符。
考点:字符串综合编程能力。
出现频率:★★★★
解析
根据题意,假设一个字符串“abcdefg”,从第2个字符开始(索引为1),删除两个字符。删除后的字符串是“adefg”。
程序代码如下:
1 #include <stdio.h>
2 #include <string.h>
3
4 char *deleteChars(char *str,int pos,int len)
5 {
6 char *p = str + pos - 1; //指向pos位置字符
7 int tt = strlen(str); // 计算字符长度
8
9 if( (pos < 1) || (p-str) > tt) //检查pos是否不大于1
10 { //或者pos超出字符串长度
11 return str;
12 }
13
14 if( (p+len-str) > tt) //len大于pos后剩余的字符个数
15 { //只需对pos位置赋'\0'
16 *p = '\0';
17 return str;
18 }
19
20 //删除len个字符
21 while(*p && *(p+len)) // len小于或等于pos后剩余的字符个数
22 { // 删除中间len个字符
23 *p = *(p+len);
24 p++;
25 }
26 *p = '\0';
27
28 return str;
29 }
30
31 int main()
32 {
33 char string[] = "abcdefg";
34 int pos = 0;
35 int len = 0;
36 int steps = 0;
37 printf("string: %s\n", string);
38 printf("input pos: ");
39 scanf("%d", &pos);
40 printf("input len: ");
41 scanf("%d", &len);
42 deleteChars(string, pos, len); //删除string的pos位置后len个字符。
43 printf("after delete %d chars behind pos %d: %s\n", len, pos, string);
44
45 return 0;
46 }
程序执行结果如下所示:
string: abcdefg
input pos: 2(输入)
input len: 2(输入)
after delete 2 chars behind pos 2: adefg
deleteChars函数首先检查pos以及len的合法性,然后找到字符串的pos位置,最后删除len个字符。
面试例题25:字符串的排序及交换。
考点:字符串综合编程能力。
出现频率:★★★
编写一个函数,首先将一条字符串分成两部分,前半部分按ASCII码升序排序,后半部分不变,(如果字符串是奇数则中间的字符不变)其次将前后两部分交换,最后输出该字符串。测试字符串“ADZDDJKJFIEJHGI”。
解析
程序代码如下:
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 /* 冒泡排序算法 */
5 void mysort(char *str, int num)
6 {
7 int i, j;
8 int temp = 0;
9
10 for (i = 0; i < num; i++)
11 {
12 for (j = i+1; j < num; j++)
13 {
14 if (str[i] < str[j]) //如果下一个值比当前值大,
15 { //则交换两个元素值
16 temp = str[i];
17 str[i] = str[j];
18 str[j] = temp;
19 }
20 }
21 }
22 }
23
24 char *foo(char *str)
25 {
26 int len = 0;
27 char *start = NULL;
28
29 if (str == NULL) //检查参数str的有效性
30 {
31 return NULL;
32 }
33
34 start = str //保存头部位置
35 while(*str++);
36 len = str - start - 1; //计算字符串长度
37 len = len / 2; //计算需要排序的字符个数
38 str = start;
39
40 mysort(str, len); //从大到小排序。
41
42 return str;
43 }
44
45 int main()
46 {
47 char string[] = "ADZDDJKJFIEJHGI";
48
49 printf("before transformation: %s\n", string);
50 foo(string);
51 printf("after transformation: %s\n", string);
52
53 return 0;
54 }
程序执行结果:
before transformation: ADZDDJKJFIEJHGI
after transformation: ZKJDDDAJFIEJHGI
foo()函数首先获得字符串的长度,然后计算需要排序的字符个数,最后调用mysort函数(使用冒泡排序方法)对字符进行排序。
面试例题26:编程实现删除字符串中所有指定的字符。
考点:字符串综合编程能力。
出现频率:★★★★
解析
根据题意,假设字符串为“cabcdefcgchci”,把该字符串中所有的字符“c”删除掉后,那么结果应该是“abdefghi”。
程序代码如下:
1 #include <stdio.h>
2
3 char *deleteChar(char *str,char c)
4 {
5 char *head = NULL;
6 char *p = NULL;
7
8 if (str == NULL) //检查str的有效性
9 {
10 return NULL;
11 }
12
13 head = p = str; //指向字符串头,准备遍历
14
15 while(*p++)
16 {
17 if(*p != c) //如果不等于c的值则在str中记录
18 {
19 *str++ = *p;
20 }
21 }
22 *str = '\0';
23
24 return head;
25 }
26
27 int main(void)
28 {
29 char string[] = "cabcdefcgchci";
30 char c = 0;
31
32 printf("input char: ");
33 scanf("%c", &c);
34 printf("before delete: %s\n", string);
35 deleteChar(string, c); //删除所有的c
36 printf("after delete: %s\n", string);
37
38 return 0;
39 }
程序执行结果:
input char: c
before delete: cabcdefcgchci
after delete: abdefghi
deleteChar()函数首先判断传入字符指针的有效性,然后使用两个指针进行操作。其中一个指针用来做记录,另一个指针进行字符串遍历。
面试例题27:分析代码——使用strcat连接字符串。
考点:字符串综合编程能力。
出现频率:★★★
下面的程序代码有什么问题吗?输出是什么?
1 #include<iostream>
2 using namespace std;
3
4 int main()
5 {
6 char *str1 = "hello";
7 char *str2 = " china";
8 char *str3 = NULL;
9
10 str3 = new char[strlen(str1)+strlen(str2)+1];
11 str3[0] = '\n';
12 strcat(str3,str1);
13 strcat(str3,str2);
14 cout << str3 << endl;
15
16 return 0;
17 }
解析
代码第12行和第13行调用strcat函数。strcat函数是库函数,其原型如下:
extern char *strcat(char *dest, const char *src);
strcat函数把src字符串加到dest字符串之后。代码第10行中用new运算符申请的堆内存是没有被初始化的,内存中的值是随机数。代码第12行调用strcat不能把str1的内容复制到堆内存中,并且会导致数组越界,同样的问题发生在代码第13行的调用中。应在代码第11行把str3[0]赋为结束符'\0'。正确的代码应为:
1 #include<iostream>
2 using namespace std;
3
4 int main()
5 {
6 char *str1 = "hello";
7 char *str2 = " china";
8 char *str3 = NULL;
9
10 str3 = new char[strlen(str1)+strlen(str2)+1];//分配堆内存
11 str3[0] = '\0'; //str3[0]赋为结束符'\0',以便strcat能正常调用
12 strcat(str3,str1); //str3变为"hello"
13 strcat(str3,str2); //str3变为"hello china"
14 cout << str3 << endl;
15
16 return 0;
17 }
程序执行结果:
hello china
答案
程序str3指向的堆内存没有初始化,不含有字符串结束符。其输出结果是随机值。
面试例题28:编程实现库函数strcat。
考点:库函数strcat的实现细节。
出现频率:★★★★★
解析
库函数strcat把字符串内容连接到目标字符串的后面,所以应该从目标字符串的末尾,也就是结束符“\0”的位置开始插入另一个字符串的内容。
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 char *mystrcat(char *dest, const char *src)
5 {
6 char *ret;
7
8 ret = dest; //保存目的字符串首地址以便返回
9 while (*dest++);
10 dest--; //此时dest指向字符串结束符
11 while (*dest++ = *src++); //循环复制
12
13 return ret;
14 }
15
16 int main(void)
17 {
18 char *dest = NULL;
19 char *str1 = "Hello ";
20 char *str2 = "World!";
21
22 dest = (char *)malloc(256);
23 *dest = '\0'; //为把目标字符串置为空,将结束符放在其开头。
24 mystrcat(mystrcat(dest, str1), str2); //链式表达式连接str1和str2
25 printf("dest: %s\n", dest);
26 free(dest);
27 dest = NULL;
28
29 return 0;
30 }
程序执行结果:
Hello World!
面试例题29:计算含有汉字的字符串长度。
考点:字符串综合编程能力。
出现频率:★★
编写gbk_strlen函数,计算含有汉字的字符串的长度,汉字作为一个字符处理。已知汉字编码为双字节,其中首字节<0,尾字节在0~63以外(如果一个字节范围为-128~127)
解析
程序代码如下:
1 #include <iostream>
2 using namespace std;
3
4 int gbk_strlen(const char* str)
5 {
6 const char* p = str; //p用于后面遍历
7
8 while(*p) //若是结束符0则结束循环
9 {
10 if (*p < 0 && (*(p+1)<0 || *(p+1)>63)) //中文汉字情况
11 {
12 str++; //str移动一位,p移动两位,因此长度加1
13 p += 2;
14 }
15 else
16 {
17 p++; //str不动,p移动一位,长度加1
18 }
19 }
20
21 return (p-str);//返回地址之差
22 }
23
24 int main()
25 {
26 char str[] = "abc你好123中国456"; //含有中文汉字的字符串
27
28 int len = gbk_strlen(str); //获得字符串长度
29 cout << str << endl;
30 cout << "len = " << len << endl;
31
32 return 0;
33
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -