c语言改写strlen(), strcpy(),判断最大值和第二大值

一、 改写strlen()

        思路:定义一个计数变量len,循环遍历字符串,每循环一次计数变量len+1,直到遍历到'\0'结束并返回。

        注意辨析sizeof(),strlen()的区别:

        1.sizeof是获取变量空间所占大小。

        2.strlen计算字符串的有效长度到'\0'为止,且不包含'\0'

        3.sizeof是运算符,strlen时函数

        4.sizeof在gcc编译中就已经计算完毕的,strlen只能在调用的时候才会运行计算

                                           
 int str_length(char *s1){
     int count = 0;
     for(int i = 0; s1[i] != '\0'; i++){
         count ++;
     }
     return count;
 }

二、改写strcpy

        思路:for循环变量字符串s2,将字符串s2中的每一位char赋值给字符串s1,直到遍历到s2的'\0'结束,但是字符串是以'\0'结尾的字符数组,我们仅仅是吧s2除'\0'以外的字符付给了字符数组s1,所以结束后要给s1手动添加'\0'字符

void  str_copy(char *s1, char *s2){
    int i;
    for(i = 0; s2[i] != '\0'; i++)
        s1[i] = s2[i];
    // 给字符数组最后补\0
    s1[i] = '\0';                     
}

三、求数组中最大值和次大值

        定义一个无符号的整形数组,求数组中的最大值和数组中的次大值

        思路:运用排序的方法,把数组按从小到大排序,数组最后一个就是最大值,数组倒数第二个就是次大值。下面代码运用的是冒泡排序方法:

 #include <stdio.h>
 
 int main(int argc, const char *argv[])
 {
     int a[] = {23, 4, 6, 89, 34, 76, 43, 80, 78, 24, 53};
     int len = sizeof(a) / sizeof(a[0]);
 
     // 冒泡排序
     for(int i = 0; i < len - 1; i++){  //执行len - 1趟
         int flag = 0;  // 一趟排序中发生交换的标志位,默认没有发生交换
         for(int j = 0; j < len - 1 - i; j++){
             if(a[j] > a[j+1]){ // 前一个元素比后一个元素大,交换
                 int temp = a[j];
                 a[j] = a[j+1];
                 a[j+1] = temp;
                 flag = 1;  // 发生交换
             }
         }
         if(!flag)  // 如果在一趟排序中没有发生交换,说明数组有序
             break;
     }
 
     printf("排序后数组:");
     for(int i = 0; i < len; i++){
         printf("%-3d", a[i]);
     }
     printf("\n最大的元素:%d\n", a[len-1]);
     printf("第二大的元素:%d\n", a[len-2]);
     return 0;
 }                                                                                                             
                                                                                                               

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值