习题1
实现一个函数 get_remain(),通过参数传递两个字符串,然后通过第 3 个参数返回这两个字符串中较长的字符串的长的部分的起始地址,如果相同则返回 NULL。不要使用 strlen() 计算字符串长度,自己实现代码去遍历字符串。如:"0123456", "0123456789" 返回 "789" 的起始地址测试时,通过命令行传递两个字符串。
1 #include<stdio.h>
2 void get_remain(char *s1,char *s2, char **s)
3 {
4 while(*s1 && *s2) { // 两个字符串都没有结束,就向后走
5 s1++;
6 s2++;
7 }
8 // 循环结束时,最少有一个字符串已结束
9 if(*s1 == '\0' && *s2 == '\0') // 两个都结束
10 *s = NULL;
11 else if(*s1 == 0) // s1 字符串结束而 s2 没有结束
12 *s = s2;
13 else // s2 字符串结束而 s1 没有结束
14 *s = s1;
15 }
16 int main(int argc, char *argv[])
17 {
18 char *ps;
19
20 // 检查命令行参数个数
21 if (argc != 3) {
22 printf("用法:%s 字符串1 字符串2\n", argv[0]);
23 return -1;
24 }
25
26 get_remain(argv[1], argv[2], &ps);
27 if (ps) {
28 printf("长的部分是:%s\n", ps);
29 } else {
30 printf("两个字符串长度相同\n");
31 }
32
33 return 0;
34 }
运行结果:
习题2
编写一个函数,去掉给定字符串中重复的字符。例如给定"google",输出"gole"
1 #include<stdio.h>
2 #include<string.h>
3 void func(char *s);
4 int main(void)
5 {
6
7
8 char arr[128];
9 gets(arr);
10 func(arr);
11 printf("%s\n",arr);
12 }
13 void func(char *s)
14 {
15 char s1[128]="",*ps=s,*index=s1;
16 char flag[128]="";
17 while(*ps)
18 {
19 if(!flag[*ps])
20 {
21 *index=*ps;
22 flag[*ps]=1;
23 index++;
24
25 }
26 ps++;
27
28 }
29 strcpy(s,s1);
30 }
运行结果:
习题3
实现一个函数 get_submax(),对 N 个元素的整型数组,求该数组的各个子数组中,子数组之和的最大值是多少,子数组的起始元素地址,以及子数组长度?这三个结果都通过参数返回。如果有相同最大值的子数组,返回先找到的子数组。例如数组a[7] = {-2, 5, 3, -6, 4, -8, 6};则子数组之和的最大值是8 (即a[1] + a[2])。
1 #include<stdio.h>
2 void get_submax(int *s,int size,int *max,int **p,int *lens);
3 int sum(int *arr,int size);
4 void printf_array(int *p,int lens);
5 int main(void)
6 {
7 int max;
8 int lens;
9 int *p;
10 int arr[7]={-2,5,3,-6,4,-8,6};
11 get_submax(arr,7,&max,&p,&lens);
12 printf("最大子数组和为%d\n",max);
13 printf("子数组长度为%d\n",lens);
14 printf_array(p,lens);
15 return 0;
16 }
17 void get_submax(int *s,int size,int *max,int **p,int *lens)
18 {
19 int total;
20 int tmax=s[0];
21 int i,j;
22 for(i=0;i<size;i++)
23 {
24 for(j=i;j<size;j++)
25 {
26 total=sum(s+i,j-i+1);
27 if(total>*max)
28 {
29 *max=total;
30 *p=s+i;
31 *lens=j-i+1;
32 }
33 }
34 }
35 }
36 int sum(int *arr,int size)
37 {
38 int i;
39 int sum=0;
40 for(i=0;i<size;i++)
41 {
42 sum+=arr[i];
43 }
44 return sum;
45 }
46 void printf_array(int *p,int lens)
47 {
48 int i;
49 for(i=0;i<lens;i++)
50 {
51 printf("%d ",p[i]);
52
53 }
54 printf("\n");
55
56 }
运行结果: