黑马程序员———C语言———【strlen()和sizeof()的区别、排序、算法】

来源:互联网 发布:关键词搜索软件 编辑:程序博客网 时间:2024/06/04 19:25

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

——————————————————————————————————————————————————————————————————

1、strlen()是函数。

strlen()是以字符为单位计算字符串或字符数组的实际长度(不考虑末尾的\0),如果字符串字符数组中间有\0,则计算\0之前的长度。

如:

char a[]="heima";char b[]={'h','e','i','m','a'};printf("a=%d\n",strlen(a));     //a=5printf("b=%d\n",strlen(b));     //b=5

char a[]="he\0ima";char b[]={'h','e','\0','i','m','a'};printf("a=%d\n",strlen(a));     //a=2printf("b=%d\n",strlen(b));     //b=2

2、sizeof是关键字,后面的()可写可不写

(1)sizeof计算字符串的长度,是字符串实际长度+1。

char a[]="heima";printf("a=%d\n",sizeof(a));     //a=6

(2)sizeof计算字符串的长度,如果字符串中间有\0,没有影响。

(3)sizeof计算字符数组的长度,就是字符数组实际的长度,中间有\0不影响

char b[]={'h','e','\0','i','m','a'};printf("b=%d\n",sizeof(b));     //b=6

综上:自定义的字符串系统自动给字符串加上结束符\0,字符数组结束系统不会自动加上结束符\0


3、冒泡排序

void main(char argc,const char * argv[]){//从键盘获取10个数放入到数组中,然后找出10个数中最大的数//定义变量,记录10个数字中的最大值int max=0;//创建数组int numbers[10];//记录数组长度int length=sizeof(numbers)/sizeof(int);//使用for循环,循环输入10个数字,并放入到数组for(int i=0;i<length;i++){//提示用户输入10个数字printf("请输入%d个数字:",i+1);scanf("%d\n",&numbers[i]);}//冒泡排序,有n个数,就循环n-1次//外层为什么要length-1?//4个数互相比较需要比3次,3个数互相比较需要比2次,所以n个数比较就要比n-1次for(int i=0;i<length-1;i++){//内层为什么要length-n?//外层每循环一次,都会有一个数字下沉,循环两次就有两个数字下沉,n次就会有n个数字下沉//为了程序更有效率的对数字排序,我们将已经下沉的数字不再参与到下次的比较,也就是让剩下的数进行比较//length-n就是n次循环后剩下的数字的个数,length-n-1就是剩下的数字需要互相比较的次数for(int j=0;j<length-1-i;j++){if(numbers[j]>numbers[j+1]){//max相当于中转站,让两个数互转位置的同时不至于丢失其中一个数据max=numbers[j];numbers[j]=numbers[j+1];numbers[j+1]=max;}}}//for循环打印排序后的数组for(int i=0;i<length;i++){printf("%d \n",numbers[i]);}}

4、选择排序

//选择排序,从小到大排列。void main(char argc.const char * argv[]){int number[6]={2,1,3,7,4,9};int temp=0;int length=sizeof(number)/sizeof(int);for(int i=0;i<length-1;i++){for(int j=i+1;j<length;j++){if(number[i]>number[j]){temp=number[i];number[i]=number[j];number[j]=temp;}}}}

5、折半查找

//如果key大于中间值,则让最小值=中间值+1//如果key小于中间值,则让最大值=中间值-1//如果最小值大于最大值,则证明要找的数不存在void main(char argc.const char * argv[]){int number[]={3,4,12,20,21,23,28,45,67,100};//查找20int low=0;int high=sizeof(number)/sizeof(int)-1;int mid=0;//要查找的数int key=20;while(min<=max){mid=(low+high)/2;if(key>number[mid]){low=mid+1;}else if(key<number[mid]){high=mid-1;}else{printf("找到了");}}printf("没找到");}

6、约瑟夫环

/*耶稣有15个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:15人围坐一圈,从第一个开始报号:1,2,3,1,2,3……,凡是报到“3”就退出圈子,最后留在圈内的人就是出卖耶稣的叛徒,请找出它原来的序号。(C语言)*/#include <stdio.h>#include <stdlib.h>void main(){   //先初始化人   int people[100];   int len=sizeof(people)/sizeof(int);   for(int i=0;i<len;i++){        people[i]=i+1;   }   //队列里的人   int left=len;   //当前的人报的数   int counter=0;   //控制while循环   int j=0;   while(1){        //只要这个人的值不为0,就让这个人喊数,函数范围是1 2 3        if(people[j]>0){            counter++;        }        //每当有人喊3的时候,就从队列中走一个人,同时让喊3的这个人变成0        //并且让下一个喊数的人从0开始喊,这样在下一次循环的时候,counter+1,这个人喊的数就变成了1        if(counter==3){            left--;            people[j]=0;            counter=0;        }        //当队列里只剩一个人的时候退出        if(left==1){            break;        }        j++;        //以下是测试        printf("j=%d,people[j]=%d,counter=%d,left=%d\n",j,people[j],counter,left);        //防止数组越界        //if(j==len){        //    j=0;        //}        //测试的小技巧,按回车继续        //getchar();   }   for(int i=0;i<len;i++){        if(people[i]>0){            printf("这个数是:%d,索引是:%d",people[i],i);        }   }}


1 0