首页 > 其他分享 >assert断言与const修饰指针的妙用(模拟实现strcpy函数)

assert断言与const修饰指针的妙用(模拟实现strcpy函数)

时间:2023-07-01 16:34:27浏览次数:47  
标签:char const assert strcpy arr1 指针


 assert断言

目录

assert断言的妙用:

头文件:

使用方法:

const修饰指针的妙用

主要用法

const在*左边

const在*右边

断言和const修饰指针的应用

模拟实现C语言strcpy函数

    1、若字符串str1,str2有空指针怎么办?

    2.str2改变了怎么办?


assert断言的妙用:

头文件:

#include <assert.h>

使用方法:

当我们不希望某件事情发生,直接就将该事件的判断语句放在assert()的括号内部,如果判断为真,没有发生,则代码正常运行;如果判断为假,那么直接终止程序,并且报错,assert断言的好处还在于报错时能够精准定位到哪一行出现了问题,所以程序员看到assert断言还是非常亲切的。

const修饰指针的妙用

主要用法

按照const在*左边,在*右边,可以分为两大类。

const在*左边

限制的是指针指向的内容,不能通过指针变量改变指针指向的内容,但是指针变量本身是可以改变的

assert断言与const修饰指针的妙用(模拟实现strcpy函数)_const修饰指针

assert断言与const修饰指针的妙用(模拟实现strcpy函数)_const修饰指针_02编辑

 比如指针p指向的内容不可以改变,但是指针p本身是谁的地址是可以改变的

const在*右边

限制的是指针变量本身,指针变量本身是不能改变的,但是指针指向的内容是可以改变的。

assert断言与const修饰指针的妙用(模拟实现strcpy函数)_assert断言_03

assert断言与const修饰指针的妙用(模拟实现strcpy函数)_const修饰指针_04编辑

比如指针p指向的内容是可以改为20的,但是指针p本身不能改变原有的指向地址a。

断言和const修饰指针的应用

讲了这么多关于断言和const修饰指针的知识,那就让我们来实践一下

模拟实现C语言strcpy函数

assert断言与const修饰指针的妙用(模拟实现strcpy函数)_assert断言_05

assert断言与const修饰指针的妙用(模拟实现strcpy函数)_const修饰指针_06编辑

我们已知函数的参数有两个,将后面的字符串内容拷贝到前面去,然后返回目标空间的起始地址

初始代码:

//模拟实现strcpy函数

char* my_strcpy(char* str1, char* str2)
{
	char* ret = str1;
	while (*str1++ = *str2++)
		;
	return ret;
}

int main()
{
	char arr1[20] = "*****************";
	char arr2[] = "i love jing";
	//strcpy(arr1, arr2);
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	printf("%s\n", my_strcpy(arr1,arr2));
	return 0;
}

assert断言与const修饰指针的妙用(模拟实现strcpy函数)_assert断言_07

 上面的代码初步实现了strcpy函数,但仍然有很多细节需要注意。

若字符串str1,str2有空指针怎么办?

以防出现上述情况,我们可以使用断言判断这两个字符串不能为空

     2.str2改变了怎么办?

assert断言与const修饰指针的妙用(模拟实现strcpy函数)_assert断言_08

assert断言与const修饰指针的妙用(模拟实现strcpy函数)_assert断言_09编辑

可以看出,在设定这个函数时,就已经考虑到被拷贝的字符串的内容不能改变,所以就需要const来修饰指针,并且在*的左边,使得指针指向的内容不会更改。

//模拟实现strcpy函数
#include<assert.h>
char* my_strcpy(char* str1,const char* str2)//const修饰被拷贝的字符串
{
	assert(str1 != NULL);//断言判断
	assert(str2 != NULL);//断言判断
	char* ret = str1;
	while (*str1++ = *str2++)
		;
	return ret;
}

int main()
{
	char arr1[20] = "*****************";
	char arr2[] = "i love jing";
	//strcpy(arr1, arr2);
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	printf("%s\n", my_strcpy(arr1,arr2));
	return 0;
}

assert断言与const修饰指针的妙用(模拟实现strcpy函数)_const修饰指针_10

 上面的代码才是最终解!


标签:char,const,assert,strcpy,arr1,指针
From: https://blog.51cto.com/u_15740457/6599950

相关文章

  • Constructive Problem
    ConstructiveProblemtimelimitpertest1secondmemorylimitpertest256megabytesinputstandardinputoutputstandardoutputAsyouknow,anyproblemthatdoesnotrequiretheuseofcomplexdatastructuresisconsideredconstructive.Youare......
  • EveryWhereIsSparserThanWhole(Construction)
    [ARC161D]EverywhereisSparserthanWhole(Construction)构造题,重在思路,代码不难。考虑有一个性质,既然部分比整体更稀疏,那么需要每个点的入度都\(>d\),因为这样删去之后\(\div(n-1)\)才会减小。形式化的说,需要满足\[记cnt=\min(度_i(1\lei\len))\\d>\dfrac{nd-cnt}{n......
  • 02-ES6语法:const常量
    ES6标准中增加了新的关键字const来定义常量。使用const定义的常量,在后续的代码中将无法被改变。下面是简单的屏幕分享,不爱看文字的同道中人可以看视频。-_-一、基本常量首先我们来看下如何通过这个关键字定义常量,代码如下:<script>constPI=3.14159;console.info(PI)......
  • constructive algorithms
    E.MishaandPaintingshttps://codeforces.com/problemset/problem/1720/E题意:给到一个n*n矩阵,问至少需要几次操作才能使得矩阵中有exactlyk个点。每次操作定义为选定一个方阵,将其所有元素变为x,x自定义。n<=500,k<=n2,aij<=n2题解:对于这类构造题,我们往往希望粗调逼近所需值......
  • const+指针+引用
       ......
  • let,const,var这三者之间的区别
    var是ES5版本引入的关键字。var声明的变量是函数作用域,而不是块级作用域。这意味着,var声明的变量可以在函数内部的任何地方进行访问,而不仅仅是在声明它的块中。此外,var声明的变量可以被重新赋值和重复声明。let和const。它们都是块级作用域的。与var不同,let和const声明的变量不能......
  • ARC162E Strange Constraints
    题意给定长度为\(n\)的序列\(A\),求序列\(B\)的个数模\(998244353\),满足以下条件:值域\([1,n]\)。\(i\)的个数不超过\(A_i\)。\(B_i\)的个数不超过\(A_i\)。\(1\len\le500\)。题解发现按照某种顺序去构造是困难的,考虑倒过来,枚举出现次数。如果某个类出现次......
  • 教你学会使用Angular 应用里的 export declare const X Y
    摘要:exportdeclareconstX:Y语法用于在Angular应用程序中声明一个具有指定类型的常量变量,并将其导出,以便在其他文件中使用。本文分享自华为云社区《关于Angular应用里的exportdeclareconstXY的用法》,作者:JerryWang。最近做Spartacus的Angular开发时,遇到下面这种......
  • postgres 错误duplicate key value violates unique constraint 解决方案
    报错信息:django.db.utils.IntegrityError:duplicatekeyvalueviolatesuniqueconstraint"parent_parentprofile_pkey"DETAIL: Key(id)=(3)alreadyexists.原因分析:postgres主键排序是不同步主要是:serialkey其实是由sequence实现的,当你手动给serial列赋值的时候,sequ......
  • C语言-assert.h
    assert() assert.h头文件定义了宏assert(),用于在运行时确保程序符合指定条件,如果不符合,就报错终止运行。这个宏常常被称为“断言”。assert(PI>3);上面代码在程序运行到这一行语句时,验证变量PI是否大于3。如果确实大于3,程序继续运行,否则就会终止运行,并且给出报错信息提示。asser......