高级C的学习

本文介绍了三个C语言编程习题:1)实现get_remain函数比较两个字符串并返回较长部分的起始地址;2)编写func函数去除字符串中的重复字符;3)定义get_submax函数求解整型数组子数组的最大和及其起始位置和长度。
摘要由CSDN通过智能技术生成

习题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 }

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值