c语言经典基础题四


前言


一、数组越界错误

用F10和监视窗口去排除,发现到12时,arr[12]=12,然后继续进行下去,发现arr[12]=0,i=0.。之后一直循环往复。
这是因为随机分配内存的arr[12]分配到了i的内存空间。
注意:此题是需要严格系统环境的,有些系统环境下不会造成循环状况。
在这里插入图片描述

二、拷贝字符串

1.可以用strcpy直接拷贝

strcpy(arr1,arr2),头文件为include<string.h>,arr1是希望拷贝arr2的内容,arr2是一个常量字符串。
可以在网页上搜cplusplus,然后在其中搜strcpy来了解它的用法。

2.可以用指针进行拷贝

在这里插入图片描述

1)初步实现

#include <stdio.h>
#include <string.h>

进阶一:
void my_strcpy(char*dest, char* src)
{
	while (*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;//拷贝\0
}

进阶二:
void my_strcpy(char* dest, char* src)
{
	while (*src != '\0')
	{
		*dest++ = *src++;//后置加加,先赋值后加加
	}
	*dest = *src;//拷贝\0
}
进阶三:

void my_strcpy(char* dest, char* src)
{
	while (*dest++ = *src++)//当都等于\0就退出,不过也实现了拷贝。
	{
		;//while中必须有一个语句,此是空语句,用;
	}
}
int main()
{
	//strcpy - 字符串拷贝
	char arr1[20] = "xxxxxxxxxxx";
	char arr2[] =   "hello";
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	
	return 0;
}

2)排除空指针情况:

方一:用if,NULL来排除

此方法较为低级,它只能等于空就退出,
不能判断是在哪里的异常,而且,每一次都要进行判断是否为空的操作。


void my_strcpy(char* dest, char* src)
{
	if (src == NULL || dest == NULL)
	{
		return;
	}
}
方二:用assert来判断
assert中可以放一个表达式,表达式的结果如果为假,就报错,如果为真啥事都不发生
assert 其实在release版本中优化了
assert(src != NULL);
assert(dest != NULL);
用assert来判断

#include <assert.h>

方一:
	assert(src != NULL);
	assert(dest != NULL);

	while (*dest++ = *src++)
	{
		;
	}
}
方二:

void my_strcpy(char* dest, char* src)
{
	assert(dest && src);//断言指针的有效性
	while (*dest++ = *src++)
	{
		;
	}
}



int main()
{
	//strcpy - 字符串拷贝
	//char arr1[20] = "xxxxxxxxxxx";
	//char arr2[] =   "hello";
	//my_strcpy(arr1, arr2);
	//printf("%s\n", arr1);
	char arr3[20] = {0};
	char* p = NULL;
	my_strcpy(arr3, p);

	return 0;
}

库函数的strcpy返回的是目标空间的起始地址

char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);//断言指针的有效性
	char* ret = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

int main()
{
	char arr1[20] = { 0 };
	char* p = "hello";
	
	//链式访问
	printf("%s\n", my_strcpy(arr1, p));

	return 0;
}

三、const应用

1.const 修饰临时变量

如果不期望临时变量赋的常量值被修改,就在变量前加const。
const 修饰的变量直接改值不可行,但是可以用指针取地址来修饰

const int num = 10;
int* p = &num;
int *p=20; //结果:num=20

2.const修饰指针变量

1)const放在* 的左边,const修饰的是指针指向的内容,表示指针指向的内容,不能通过指针来改变了;但是指针变量本身可以修改

const int* p = &num;
 *p = 20;//err
 p = &n;//ok

2)const放在* 的右边,const修饰的指针变量本身,表示指针变量本身的内容不能被修改,但是指针指向的内容,可以通过指针来改变。

int* const p = &num;
*p = 20;//ok
 p = &n;//err

四、求字符串长度

注意:size_t=unsigned int
size_t my_strlen(const char* str)
{
	size_t count = 0;
	assert(str != NULL);

	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}

int main()
{
	char arr[] = "abcdef";
	printf("%d\n", my_strlen(arr));

	return 0;
}

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值