首页 > 其他分享 >const和assert的使用方法

const和assert的使用方法

时间:2023-05-28 21:32:01浏览次数:37  
标签:char const src dest assert ++ strcpy 方法

首先我们先简单的使用函数来模拟完成一个strcpy函数。

#include <stdio.h>

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

int main()
{
	char arr1[] = "abcdefg";
	char arr2[] = { 0 };
	my_strcpy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

结果如下:

const和assert的使用方法_c++


以上是我们简单用函数实现的strcpy函数,但是他函数处的代码有点嗦,我们可以对其简化:

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

我们可以修改成:

void my_strcpy(char* dest, char* src)
{
	while (*dest++ = *src++)
		;
}

*dest++ = *src++;可以理解为,先将*src中的值赋值给*dest,复制完成后,再dest++,src++,指针指向下一字符。

简化完成后,我们开始介绍const的作用,const关键字我们知道他有修饰常变量的作用,被修饰的变量成为常变量后,具有了部分常量的性质,其中之一就是:值不能被修改。

在官方给定的strcpy函数的定义如下:

const和assert的使用方法_#include_02


定义中说明:strcpy函数把源字符串结束标志\0也会拷贝到目的地字符串中。

const和assert的使用方法_bc_03


定义中在char* src的前面加了个const,作用是修饰这个*src,不让这个*src的值被修改。

#include <stdio.h>

void my_strcpy(char* dest, const char* src)
{
	while (*dest++ = *src++)
		;
}

int main()
{
	char arr1[] = "abcdefg";
	char arr2[10] = "";
	my_strcpy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

运行结果如下:

const和assert的使用方法_#include_04


若这时的*dest++ = *src++,更改为*src++ = *dest++的话,程序执行时就会提示报错。

如:

const和assert的使用方法_#include_05


小提示:const所在位置的不同,导致的结果也是不同的。

const修饰指针:

const放在*的左边(const char* src)

const修饰的是*p,表示p指向的对象不能通过p来改变,但是p变量中的地址是可以改变的。

const放在*的右边(const char* const src)

const修饰的是p,表示p的内容不能被改变,但是p指向的对象是可以通过p来改变的。


我们在设想一下,如果我们的arr1或arr2两个字符串中有一个被置为NULL,但是我们还硬要执行的话,这时就会出现报错,且如果是一个大型工程的话,代码量很多我们查找起来也是比较麻烦。

所以我们可以借助一个宏assert(断言),注意assert是一个宏,不是一个函数。assert()宏接受一个整形表达式参数。如果表达式的值为假,assert()宏就会调用_assert函数在标准错误流中打印一条错误信息,并调用abort()(abort()函数的原型在stdlib.h头文件中)函数终止程序。

使用assert宏需要声明一个头文件:include <assert.h>

假设我们的程序是这样:

#include <stdio.h>
#include <assert.h>

void my_strcpy(char* dest, const char* src)
{
	assert(dest != NULL);
	while (*dest++ = *src++)
		;
}

int main()
{
	char arr1[] = "abcdefg";
	char arr2[10] = "";
	char* p = NULL;


	my_strcpy(p, arr1);
	printf("%s\n", arr2);
	return 0;
}

运行结果如下:

const和assert的使用方法_#include_06


错误信息的结尾告诉了我们assert断言程序的位置,在122行,发现实参dest为空指针了,这时,我们在回头去找函数传参的位置,发现实参一个是p一个是arr1,在往上看,就能发现arr1非空,而p是个空指针,这就排查出问题了。

所以通常我们把传递过来的参数都加上assert断言,这样如果有问题,就可以及时发现。

最后一点,定义中的函数是有返回值的为:char*。返回值是char*的原因是,这样可以实现链式访问。

如:

#include <stdio.h>
#include <assert.h>

char* my_strcpy(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	while (*dest++ = *src++)
		;
	return ret;
}

int main()
{
	char arr1[] = "abcdefg";
	char arr2[10] = "";

	printf("%s\n", my_strcpy(arr2, arr1));
	return 0;
}

函数的结果直接作为printf函数的参数进行输出。结果如下:

const和assert的使用方法_c++_07


如果我们照猫画虎写一个strlen函数该怎么写呢?

代码如下:

#include <stdio.h>
#include <assert.h>

int my_strlen(const char* str)
{
	assert(str != NULL);
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}

int main()
{
	char arr[10] = "abcdefg";
	printf("%d\n",my_strlen(arr));
	return 0;
}

运行结果如下:

const和assert的使用方法_c++_08


标签:char,const,src,dest,assert,++,strcpy,方法
From: https://blog.51cto.com/u_15865089/6366486

相关文章

  • Appium自动化(18):使用appium后安卓手机无法调出键盘解决方法
    问题:用appium进行真机调试后,使用手机的app进行输入时无法调出键盘。原因:appium调试时,将手机输入法设置成了UnicodeIME注:按键详细操作参考:转载至作者:oscarforever  地址:https://www.cnblogs.com/oscarforever/p/10721774.html解决方法:方法一,手机设置里修改输入法:不同的手机型号......
  • STATA 安装esttab出错 解决方法
      执行:searchesttab点击红色框就可以安装了。一句话,先查找,点击,来安装 ......
  • 前端自动识别CAD图纸提取信息方法总结
    前言CAD图纸自动识别和提取信息具有许多意义,包括以下几个方面:提高工作效率:传统上,对于大量的CAD图纸,人工识别和提取信息是一项耗时且繁琐的任务。通过自动化这一过程,可以大大提高工作效率,节省时间和人力资源。减少错误和精度提升:人工处理CAD图纸容易出现错误,例如错读数字或......
  • java的方法
    1.重载:a.方法名相同b.参数类型或个数不同c.返回只可以相同也一直不同注:重载不能只有返回值不同publicclassHello{publicstaticvoidmain(Stringargs[]){System.out.println("helloowrld");System.out.println(add(1,......
  • 数组方法ES5 + ES6
      sort/reverse主要用于排序,会影响原来数组。constarr=[1,2,3]arr.sort();//正序arr.reverse();//反序arr.sort(()=>0.5-Math.random());//乱序   splice编辑元素,会影响原来数组//splice(目标下标,删除多少元素,插入元素);constarr......
  • 方法重写
            ......
  • DAO和增删改查通用方法--BasicDao
    1. 先分析一个问题  852apache-dbutils+ Druid简化了JDBC开发,但还有不足: 1. SQL 语句是固定,不能通过参数传入,通用性不好,需要进行改进,更方便执行增删改查2.对于select 操作,如果有返回值,返回类型不能固定,需要使用泛型3.将来的表很多, 业务需求复杂,不可能只靠一个Java类完成4......
  • 掌握使用类方法、实例方法时的几点注意事项
    packageitheima;publicclassTest{publicstaticvoidmain(String[]args){//掌握使用类方法、实例方法时的几点注意事项//1.类方法中可以直接访问类的成员,不可以直接访问实例成员//2.实例方法中既可以直接访问类成员,也可以直接访问实例......
  • 类方法的用法
    packagecom.StaticDemo;publicclassTest2{publicstaticvoidmain(String[]args){//1.类方法的用法//类名.类方法(推荐)Stndent1.printHelloWord();//对象.类方法(不推荐)Stndent1s=newStndent1();s.print......
  • java中的常用类及常用方法
    java中的常用类及常用方法math类的常用方法方法名说明publicstaticintabs(inta)获取参数绝对值publicstaticdoubleceil(doublea)向上取整publicstaticdoubleflcor(doublea)向下取整publicstaticintround(floata)四舍五入publicstaticin......