c语言11-折半查找、字符数组定义、字符数组使用、左++和右++

1.折半查找

前提:数据有序;
优点:查找速度快;
在这里插入图片描述

代码

//折半查找
//在长度为len的数组arr中,查找关键字key,成功返回下标,失败返回-1
int BinSearch(int *arr,int len,int key)
{
	int low=0;
	int high=len-1;
	int mid;

	while(low <= high)
	{
		mid = (low + high)/2;

		if(arr[mid] == key)//找到
		{
			return mid;
		}
		else if(arr[mid] < key)//在后半部分找
		{
			low = mid +1;
		}
		else//在后半部分找
		{
			high = mid - 1;
		}
	}

	return -1;
}

int main()
{
	int arr[]={1,2,3,4,5,6,7,8,9,10};

	for(int i=-1;i<=13;i++)
	{
		printf("%d\n",BinSearch(arr,sizeof(arr)/sizeof(arr[0]),i));
	}

	return 0;
}

结果:

在这里插入图片描述

2.调试

下断点:F9(在左侧边栏单机鼠标左键)
在这里插入图片描述

3.字符数组定义

一天的生活、工作都在进行文字处理,数字处理较少;
0的形式:0,0.0,false,NULL,‘\0’
字符数组:非常重要,用的多,考的多;
字符:用单引号 ‘’ 包括起来的一个字符,例如’a’,‘1’,‘0’;
字符串:用双引号 “” 包括起来的一个字符串,由0个或者多个字符串组成,例如"“,“123d”,“ad dd”;
--------字符串一定有个隐藏的 ‘\0’ 表示结尾,‘\0’ 是字符串的结尾标志;
--------是否为字符串:1、有没有”";
-----------------------------2、有木有’\0’;
在这里插入图片描述

int main()
{
	//和int数组类似的定义
	char arr[5] = {'a','b','c','d','e'};//不是字符串
	char brr[10] = {'a','b','c','d','e'};//剩余的为'\0',是字符串
	char crr[]={'a','b','c','d','e'};//不是字符串
	char drr[10];//为随机值,不是字符串

	//字符数组特有的定义
	char err[]="abcd";//是字符串
	//char frr[4] = "abcd";//error
	char grr[10] = "abcd";//是字符串
	char *hrr = "abcd";//字符串常量,内容不能被修改,是字符串

	printf("%s\n",arr);//%s输出字符串
	printf("%s\n",brr);
	printf("%s\n",crr);
	printf("%s\n",drr);
	printf("%s\n",err);
	printf("%s\n",grr);
	printf("%s\n",hrr);


	return 0;
}

结果:
在这里插入图片描述

在这里插入图片描述

烫烫烫烫… 0xcccc… 局部变量没有初始话
屯屯屯屯… 0xcdcd… 动态内存没有初始化

在这里插入图片描述
在这里插入图片描述

4.字符数组使用

(1)复制

str2=str1;//error,不能整体赋值

//将字符串src拷贝到des中
void Mystrcpy(char *des,char *src)//只满足需求,练习用,细节未处理
{
	int i;
	for(i=0;src[i] != '\0';++i)
	{
	des[i] = src[i];
	}
	des[i] = '\0';
}

int main()
{
	char str1[10]="abcde";
	char str2[10]="xyz";
	char str3[10];

	//复制str2--str1
	//str2 = str1;//error
	//不能整体赋值
	printf("%s\n",str3);
	int i;
	for(i=0;str1[i] != '\0';++i)//利用字符串'\0'结尾标记
	{
	    str3[i] = str1[i];
	}
	str3[i]='\0';
	printf("%s\n",str3);

	return 0;
}

在这里插入图片描述

(2)统计长度

库函数有:
#include <string.h>
在这里插入图片描述
在这里插入图片描述

//求字符串str的长度.不包含'\0',返回字符串的有效长度,"abcd"-->4
int Mystrlen(char *str)//只满足需求,练习用,细节未处理
{
	int i;

	for(i=0;str[i] != '\0';++i)
	{
	
	}

	return i;
}
int main()
{
	char str1[10]="abcde";

	printf("%d\n",strlen(str1));
	printf("%d\n",Mystrlen(str1));

	return 0;
}

在这里插入图片描述

(3)字符串连接

代码实现:

void Mystrcat(char *des,const char *src)//仅练习,没有优化
{
	assert(des !=NULL && src != NULL);
	if(des ==NULL || src == NULL)
	{
		return ;
	}

	//找尾巴
	while(*des != '\0')
	{
	des++;
	}

	//复制
	while(*des++ = *src++);

}

int main()
{
	char str1[10]="abc";
	char str2[10]="xyz";

    printf("%s\n",str1);

	Mystrcat(str1,str2);

	printf("%s\n",str1);

	return 0;
}

结果:

在这里插入图片描述

注意:

在这里插入图片描述

(4)比较大小

if(str1 > str2)–不报错,但错误

错误示例:

int main()
{
	char str4[]="abcde";
	char str5[]="xyz";
	char str6[]="abcde";
	if(str4 > str5)
	{
	printf("%s > %s\n",str4,str5);
	}
	else
	{
	printf("%s < %s\n",str4,str5);
	}
	if(str6 > str5)
	{
	printf("%s > %s\n",str6,str5);
	}
	else
	{
	printf("%s < %s\n",str6,str5);
	}
	
	return 0;
}

错误结果:

在这里插入图片描述

代码:

//比较字符串大小
//"abc"<"x";"abc" == "abc";"abc" >"abb" ;
//逐个比较,按照字典序,只要分出大小,就结束;
//大于返回大于0的数字,相等返回0,小于返回小于0的数字;
int Mystrcmp(const char *str1,const char *str2)
{
	assert(str1 !=NULL && str2 != NULL);
	if(str1 ==NULL || str2 == NULL)
	{
		return 0;
	}

	int tmp;//保存两个字符相减的差值

	while((tmp = *str1-*str2) == 0 && *str1 != '\0')
	{
		str1++;
		str2++;
	}

	return tmp;
}

int main()
{


	printf("%d\n",Mystrcmp("abc","x"));
	printf("%d\n",Mystrcmp("abc","abb"));
	printf("%d\n",Mystrcmp("abc","abc"));
	printf("%d\n",Mystrcmp("abc","abcc"));

	return 0;
}

结果:

在这里插入图片描述

(5)数组和指针:

数组和指针有如下等式:
**p[i] == (p + i);
arr[i] == (arr + i);

int main()
{
	char arr[10] = "abcde";
	char *p;
	p = arr;
	p = &arr[2];
	printf("%c\n",p[-1]);
	//char *p = arr;//数组名表示数组首元素的地址
	//char *p = &arr[0];//arr[0] -> char   &arr[0] -> char*

	return 0;
}

在这里插入图片描述

例如:

1.字符串拷贝

void Mystrcpy(char *des,char *src)
{
	int i;
	for(i=0;src[i] != '\0';++i)
	{
	des[i] = src[i];
	}
	des[i] = '\0';
}

void Mystrcpy2(char *des,char *src)
{
	int i;
	for(i=0;*(src+i) != '\0';++i)
	{
		*(des + i) = *(src + i);
	}
	*(des+i) = '\0';
}

void Mystrcpy3(char *des,char *src)
{
	while(*src != '\0')
	{
	    *des = *src;
		des++;
		src++;
	}
	*des = '\0';
}

//一句实现字符串拷贝,平时不建议使用,可读性不好
void Mystrcpy4(char *des,char *src)
{
	while(*des++ = *src++)//很重要,记得
}

对于 while(des++ = src++); 的理解
由于
和 ++的优先级一样,结合性未自右向左;
在这里插入图片描述
所以先结合des++和src++,再执行
,赋值循环可以实现

在这里插入图片描述
由于 = 与 == 不同
在这里插入图片描述
所以当循环到 ‘\0’ 时,先执行赋值,再结束循环。
在这里插入图片描述

2.输出

int main()
{
	char str1[10]="abcde";

	for(char *p=str1;*p != '\0';++p)
	{
	    printf("%c",*p);
	}
	printf("\n");

	return 0;
}

结果:
在这里插入图片描述
3.复制
在这里插入图片描述

5.左++和右++

int main()
{
	int i = 10;
	int j = i++;
	printf("%d\n%d\n\n",i,j);

	i = 10;
	int z = ++i;
	printf("%d\n%d\n\n",i,z);

	i = 10;
	j = i++;
	z = ++i;
	printf("%d\n%d\n%d\n\n",i,j,z);

	i = 10;
	j = ++i;
	z = i++;
	printf("%d\n%d\n%d\n",i,j,z);
	
	return 0;
}

结果:

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值