assert(指针保护),strcpy,const,strlen

简介: assert(指针保护),strcpy,const,strlen

1. 快捷键:


20210206193911620.png


2. 实现自己的strcpy



void my_strcpy(char* dest,char* src)
{
    int i=0;
   while(*(src)!='\0')
    {
     *dest=*src;//字符指针解引用可以访问一个字符
     src++;
     dest++;
    }
    *dest=*src;//此时*src里面放的是\0
}
int main()
{
    char arr1[]="###########";
    char arr2[]="bit";
    my_strcpy(arr1,arr2);
    printf("%s\n",arr2);
    return 0;
}

如何优化?

void my_strcpy(char* dest,char* src)
{
    int i=0;
   while(*(src)!='\0')
    {
     *dest++=*src++;//这里1111111111111111
    }
    *dest=*src;
}
int main()
{
    char arr1[]="###########";
    char arr2[]="bit";
    my_strcpy(arr1,arr2);
    printf("%s\n",arr2);
    return 0;
}

如何进一步优化?

void my_strcpy(char* dest,char* src)
{
   while( *dest++=*src++)//这里:因为‘\0’=0
    {
          ;
    }
}
int main()
{
    char arr1[]="###########";
    char arr2[]="bit";
    my_strcpy(arr1,arr2);
    printf("%s\n",arr2);
    return 0;
}

如何进进一步优化?


使用assert–断言–需要引用头文件#include<assert.h>

#include<assert.h>
#include<stdio.h>
void my_strcpy(char* dest,char* src)
{
    assert(dest != NULL);//断言--如果不满足会报错--易于发现问题
    assert(src !=NULL);
   while( *dest++=*src++)//这里:因为‘\0’=0
    {
          ;
    }   
}
int main()
{
    char arr1[]="###########";
    char arr2[]="bit";
    my_strcpy(arr1,arr2);
    printf("%s\n",arr2);
    return 0;
}

如何进进进一步优化?

#include<assert.h>
#include<stdio.h>
void my_strcpy(char* dest,const char* src)//这里加了const
{
    assert(dest != NULL);
    assert(src !=NULL);
   while( *dest++=*src++)
    {
          ;
    }   
}
int main()
{
    char arr1[]="###########";
    char arr2[]="bit";
    my_strcpy(arr1,arr2);
    printf("%s\n",arr2);
    return 0;
}

最终答案:


优化了哪里:

1.my_strcpy的返回类型是char*

2.加入了断言assert

3.使用了后置++

4.打印的时候变量是函数

#include<assert.h>
char* my_strcpy(char* dest,const char* src)//加const是为了防止
//while(*dest++=*src++)中二者写反//为了保护源头的数据不会被修改
{//把src指向的字符串拷贝到dest指向的空间,包含‘\0’
    char* ret=dest;
    assert(dest !=NULL);
    aeesrt(src !=NULL);
    while(*dest++=*src++)//先解引用-再赋值-再++
    {
        ;
    }
    return ret;
}
int main()
{
    char arr1[]="###########";
    char arr2[]="bit";
    printf("%s\n", my_strcpy(arr1,arr2););
    return 0;
}


2. const:



const来修饰指针:(const修饰不同位置作用不同)

1.const放在指针变量的左边时:
修饰的是 **p:也就是说–不能通过p来改变
p(num)的值

int main()
{
    const int num=10;
    const int* p=&num;//(由于给p加了const所以P无法改变)
    *p=20;
    printf("%d",num);
    return 0;
}

2.const放在指针变量的*右边时: 修饰的是p:也就是说–p不能被改变


3.my_strlen



#include<assret.h>
int my_strlen(const char* str)//求字符串长度//const保证内容不被改变
{
    int count=0;//要有一个计数器啊!!!
    assert(str !=NULL);//断言//保证指针的有效性
    while(*str !='\0')//
    {
        count++;
        str++;//指针向后走一步!!!
    }
    return conut;
}
int main()
{
    char arr[]="abcdef";
    int len=my_strlen(arr);
    printf("%d\n",my_strlen(arr));
    return 0;
}
相关文章
|
6月前
|
C++
C++中的const指针与const引用
C++中的const指针与const引用
75 2
|
1月前
|
C++
魔法指针 之 assert断言 传址调用 传值调用
魔法指针 之 assert断言 传址调用 传值调用
26 0
|
1月前
|
Serverless 编译器 C语言
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
|
3月前
|
编译器
【Bug记录】C2662:不能将this指针从const转换为非const
【Bug记录】C2662:不能将this指针从const转换为非const
|
4月前
const修饰指针
const修饰指针
23 0
|
5月前
|
安全 C语言
【C语言】:野指针和assert断言
【C语言】:野指针和assert断言
32 0
|
6月前
|
C语言
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror(下)
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror
26 0
|
6月前
|
安全 C语言
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror(中)
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror
42 0
|
6月前
|
C语言
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror(上)
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror
31 0
|
6月前
|
安全 程序员 编译器
了解野指针与assert断言 拿捏指针的使用!
了解野指针与assert断言 拿捏指针的使用!