📄 c.txt
字号:
7 while( !(ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
8 { //循环比较两个字符是否相等
9 ++src; //如果不等或者到了dst字符串末尾
10 ++dst; //退出循环
11 }
12 if ( ret < 0 ) //ret保存着字符比较的结果
13 ret = -1 ;
14 else if ( ret > 0 )
15 ret = 1 ;
16 return( ret );
17 }
18
19 int main()
20 {
21 char str[10] = "1234567";
22 char str1[10] = "1234567"; //str1 == str
23 char str2[10] = "12345678"; //str2 > str
24 char str3[10] = "1234566"; //str3 < str
25
26 int test1 = mystrcmp(str, str1); //测试str与str1比较
27 int test2 = mystrcmp(str, str2); //测试str与str2比较
28 int test3 = mystrcmp(str, str3); //测试str与str3比较
29
30 cout << "test1 = " << test1 << endl;
31 cout << "test2 = " << test2 << endl;
32 cout << "test3 = " << test3 << endl;
33
34 return 0;
35 }
mystrcmp()函数对src和dst两个字符串同时进行遍历,当发现它们存在不同值时停止循环,并根据它们的最后一个字符的大小,返回相应的结果。程序输出结果:
test1 = 0
test2 = -1
test3 = 1
面试例题16:编程查找两个字符串的最大公共子串。
考点:字符串相关的综合编程能力。
出现频率:★★★
解析
对于两个字符串A和B,如果A=“aocdfe”,B=“pmcdfa”,则输出“cdf”。
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4
5 char *commonstring(char *str1, char *str2)
6 {
7 int i, j;
8 char *shortstr, *longstr;
9 char *substr;
10
11 if (NULL == str1 || NULL == str2) //判断str1与str2的有效性
12 {
13 return NULL;
14 }
15
16 if (strlen(str1) <= strlen(str2)) //shortstr和longstr分别指向较短和较长的字符串
17 {
18 shortstr = str1;
19 longstr = str2;
20 } else
21 {
22 shortstr = str2;
23 longstr = str1;
24 }
25
26 if(strstr(longstr, shortstr) != NULL) //如果在长的字符串中能寻找短的字符串
27 { //返回短字符串
28 return shortstr;
29 }
30
31 substr = (char *)malloc(sizeof(char) * (strlen(shortstr) + 1)); //申请堆内存存放返回结果
32
33 for(i=strlen(shortstr)-1; i>0; i--)
34 {
35 for(j=0; j<=strlen(shortstr)-i; j++)
36 {
37 memcpy(substr, &shortstr[j], i); //将短字符串的一部分复制到substr,
38 substr[i] = '\0'; //其长度逐渐减小
39 if(strstr(longstr, substr) != NULL) //如果在longstr中能找到substr则返回substr
40 return substr;
41 }
42 }
43
44 return NULL;
45 }
46
47 int main()
48 {
49 char *str1 = (char *)malloc(256); //分配堆内存存放字符串str1和str2
50 char *str2 = (char *)malloc(256);
51 char *common=NULL;
52
53 gets(str1); //从终端输入str1和str2
54 gets(str2);
55
56 common = commonstring(str2, str1); //取最大的相同子串
57
58 printf("the longest common string is: %s\n", common);
59
60 return 0;
61 }
为了方便,可以利用库函数strstr寻找一个字符串中的子串。这个程序的步骤如下。
q 代码第11~第14行,检查参数str1和str2的有效性。
q 计算两个字符串的长短。
q 调用strstr直接进行两个字符串的整串比较,如果不为NULL,说明短串被长串所包含,直接返回短串即可,否则进行下一步。
q 申请一块大小为短串长度加1的堆内存,这块内存用于保存最大公共子串。
q 循环取短串的子串放入堆内存,调用strstr函数检查长串中是否包含这个子串,如果包含则返回堆内存。值得注意的是,短串的长度是不断减小的。
下面是程序执行结果:
aocdfe(输入)
pmcdfa(输入)
the longest common string is: cdf
面试例题17:不能使用printf,将十进制数以二进制和十六进制的形式输出。
考点:用字符串表示十进制数。
出现频率:★★★
解析
不能使用printf系列库函数,可以通过位运算得到十进制数的二进制形式和十六进制形式的字符串,再将字符串打印。程序代码如下所示:
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4
5 char *get2String(long num) //得到二进制形式的字符串
6 {
7 int i=0;
8 char* buffer;
9 char* temp;
10
11 buffer = (char*)malloc(33);
12 temp = buffer; //temp
13 for (i=0; i < 32; i++)
14 { //给数组的32个元素赋0或1
15 temp[i] = num & (1 << (31 - i));
16 temp[i] = temp[i] >> (31 - i);
17 temp[i] = (temp[i] == 0) ? '0': '1';
18 }
19 buffer[32] = '\0'; //字符串结束符
20
21 return buffer;
22 }
23
24 char *get16String(long num) //得到十六进制形式的字符串
25 {
26 int i=0;
27 char* buffer = (char*)malloc(11);
28 char* temp;
29
30 buffer[0] = '0'; //“0x”开头
31 buffer[1] = 'x';
32 buffer[10] = '\0'; //字符串结束符
33 temp = buffer + 2;
34
35 for (i=0; i < 8; i++)
36 { //给数组的8个元素赋值
37 temp[i] = (char)(num<<4 * i>>28);
38 temp[i] = temp[i] >= 0 ? temp[i] : temp[i] + 16;
39 temp[i] = temp[i] < 10 ? temp[i] + 48 : temp[i] + 55;
40 }
41 return buffer;
42 }
43
44 int main()
45 {
46 char *p = NULL;
47 char *q = NULL;
48 int num = 0;
49
50 printf("input num: ");
51 scanf("%d", &num); //输入整数
52
53 p = get16String(num); //得到16进制形式的字符串
54 q = get2String(num); //得到2进制形式的字符串
55
56 printf("%s\n", p);
57 printf("%s\n", q);
58
59 return 0;
60
}
这个程序中,get2String和get16String分别用于得到二进制字符串和十六进制字符串。
long型的整数是4个字节,即32位,每一位用0或1表示,get2String函数申请了33个字节(包括‘\0’)的堆内存存放结果,get16String函数申请11个字节(包括‘0’、‘x’和‘\0’)。然后把每位的值赋给堆内存的对应位置。程序执行结果:
input num: 456789(输入)
0x0006F855
00000000000000000000000001010101
面试例题18:在字符串中,插入字符统计的个数。
考点:字符串综合编程能力。
出现频率:★★★★
解析
根据题意,需要在字符串中插入字符统计的个数。例如字符串aaab,插入字符个数后变成aaa3b1。
程序代码如下所示。
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4
5 #define MAXCOUNT 2*100
6
7 char *transformation(char *str)
8 {
9 int len=strlen(str);
10 char *buf=new char[len+1];
11
12 char *p=str;
13 char *q=p+1;
14 int count=1;
15 while(*q)
16 {
17 if(*p==*q)
18 {
19 count++;
20 p++;
21 q++;
22 }
23 else
24 {
25 itoa(count,buf,10);
26 int nbits=strlen(buf);
27 strcat(buf,q);
28 *q=0;
29 strcat(str,buf);
30 q+=nbits;
31 p=q;
32 q=p+1;
33 count=1;
34 }
35 }
36
37 itoa(count,buf,10);
38 strcat(str,buf);
39
40 delete []buf;
41 buf=NULL;
42 return str;
43 }
44
45 int main()
46 {
47 char str[MAXCOUNT];
48
49 printf("please input a string:");
50 scanf("%s",&str);
51 printf("before transformation: %s\n",str);
52 char *pstr=transformation(str);
53 printf("after transformation: %s\n",pstr);
54
55 return 0;
56 }
程序中的transformation()函数用来转换字符串。我们以字符串aaab为例来说明其执行过程。为了计算方便,首先申请了5字节的堆内存buf(aaab为4字节,加一个结束符为5字节)来存放字符串数字相关的信息。初始计数为1,然后进行下面的步骤。
遍历aaab直到找到不同的字符,然后在buf中保存3,把str变为aaa(即字符“b”位置内存设为0)。然后执行strcat(str, buf),此时str变为aaa3b,计数为1。如果到字符串末尾(碰到结束符“\0”),则退出循环,否则继续进行以上的步骤。
如果退出循环,最后一个字符个数存入buf(这里b的个数1),此时str为aaa3b,经过调用strcat(str, buf),str变为aaa3b1。
释放buf堆内存并返回str。程序执行结果为:
please input a string:aaab
before transformation: aaab
after transformation: aaa3b1
6.2.3 其他编程问题
面试例题19:字符串编码例题。
考点:字符串相关的综合编程能力。
出现频率:★★
对一个长度小于20的字符串进行编码,遵循3个规则。
q 字母用后面的第4个字母替换。例如:a->e,A -> E,X -> b,y ->c,,z ->d。
q 如果字符不是字母,字符保持不变。
q 翻转整个字符串。
解析
整个过程可以分为两部分:替换字符和翻转字符串,其中替换字符还包括检查字符是否是在字母表中的。程序代码如下:
1 #include <iostream>
2 using namespace std;
3
4 char LowerCaseAlphabets[] =
5 {'a','b','c','d','e','f','g','h',
6 'i','j','k','l','m','n','o','p',
7 'q','r','s','t','u','v','w','x','y','z'};
8 char UpperCaseAlphabets[]=
9 {'A','B','C','D','E','F','G','H',
10 'I','J','K','L','M','N','O','P',
11 'Q','R','S','T','U','V','W','X','Y','Z'};
12
13 char GetFourthChar(char chrSource,char alphabets[])
14 {
15 for(int i=0;i<26;i++)
16 {
17 if(alphabets[i]==chrSource)
18 {
19 int index = (i+4) % 26;
20 return alphabets[index];
21 }
22 }
23 return '\0';
24 };
25
26 void ReplaceChars(char chars[], int len)
27 {
28 for(int i=0; i<len; i++)
29 {
30 if('a' <= chars[i] && chars[i] <= 'z')
31 {
32 chars[i]=GetFourthChar(chars[i], LowerCaseAlphabets);
33 }
34 else if('A' <= chars[i] && chars[i] <= 'Z')
35 {
36 chars[i]=GetFourthChar(chars[i], UpperCaseAlphabets);
37 }
38 }
39 };
40
41 void ReverseString(char str[],int len)
42 {
43 int begin=0, end=len-1;
44 if(str[end] == '\0')
45 end--;
46
47 char hold;
48 while(begin < end)
49 {
50 hold = str[begin];
51 str[begin] = str[end];
52 str[end] = hold;
53
54 begin++;
55 end--;
56 }
57 };
58
59 void EncodeString(char str[],int len)
60 {
61 ReplaceChars(str, len);
62 ReverseString(str, len);
63 };
64
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -