一、 改写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;
}