C语言初阶——实用调试技巧(新课学习)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

strcpy 字符串拷贝

char * strcpy (char * destination, const char * source);

#include<string.h>//strcpy头文件
int main()
{
    char arr1[20] = { 0 };//char arr1[20] = "woshishui";
    char arr2[] = "hello";
    strcpy(arr1, arr2);
    printf("%s\n", arr1);

    return 0;
}

函数实现

void my_strcpy(char* dest, char* src)
{
    while (*src != '\0')
    {
        *dest = *src;
        dest++;
        src++;
    }
    *dest = *src;
//拷贝'\0'
}
int main()
{
    char arr1[20] = "woshishui";
    char arr2[] = "hello";
    my_strcpy(arr1, arr2);
    printf("%s\n", arr1);

    return 0;
}

优化

void my_strcpy(char* dest, char* src)
{
    while (*dest++ = *src++)
//'\0'的ASCII码值为0
    {
        ;
    }
}
int main()
{
    char arr1[20] = "woshishui";
    char arr2[] = "hello";
    my_strcpy(arr1, arr2);
    printf("%s\n", arr1);

    return 0;
}

当source无指向,为空指针时,那么解引用时就会出现问题——读取访问权限冲突,程序挂了。

再优化

#include<assert.h>
void my_strcpy(char* dest, char* src)
{
    
//if (dest == NULL || src == NULL)//判断指针的有效性。
    //{
    //    return;
    //}//这里虽然在遇到空指针,不执行代码,直接返回,拦截了空指针的问题,但没有报错,没有暴露问题,不易找出错误代码。

    //断言
    //assert中放一个表达式,表达式的结果为假,则报错;结果为真,则正常往下运行。//即,只能判断真假。

    assert(dest != NULL);
    assert(src != NULL);

    //也可以写成:assert(dest && src);

    while (*dest++ = *src++)//'\0'的ASCII码值为0
    {
        ;
    }
}
int main()
{
    char arr1[20] = "woshishui";
    char *p = NULL;
    my_strcpy(arr1, p);
    printf("%s\n", arr1);

    return 0;
}

const


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

库函数strcpy返回的是目标空间的起始位置

#include<assert.h>
char * my_strcpy(char* dest, char* src)
{
    assert(dest && src);
    char* ret = dest;
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}
int main()
{
    char arr1[20] = "woshishui";
    char* p = NULL;

    //链式访问:
    printf("%s\n", my_strcpy(arr1, p));//打印字符串:从起始位置开始。

    return 0;
}


练习:

求字符串长度

strlen

#include<string.h>
int my_strlen(char* arr)
{
    int count = 0;
    while (*arr != '\0')
    {
        arr++;
        count++;
    }
    return count;
}
int main()
{
    char arr[] = "abcdef";
    
    printf("%d\n", my_strlen(arr));
    return 0;
}

使用const

#include<string.h>
#include<assert.h>

int my_strlen(const char* arr)
{
    int count = 0;
    assert(arr != NULL);
    while (*arr != '\0')
    {
        arr++;
        count++;
    }
    return count;
}
int main()
{
    char arr[] = "abcdef";

    printf("%d\n", my_strlen(arr));
    return 0;
}

标准答案:

#include<string.h>
#include<assert.h>

unsigned int my_strlen(const char* arr)
//size_t my_strlen(const char* arr)//strlen返回类型:size_t——unsigend int
{
    unsigned int count = 0;
    assert(arr != NULL);
    while (*arr != '\0')
    {
        arr++;
        count++;
    }
    return count;
}
int main()
{
    char arr[] = "abcdef";

    printf("%d\n", my_strlen(arr));
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/779342.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自动化设备上位机设计 三

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 using SqlSugar;namespace 自动化上位机设计 {public partial class Form1 : Form{SqlHelper sqlHelper new SqlHelper();SqlSugarClient dbContent null;bool IsRun false;int Count 0;public Form1(){Initializ…

SpringBoot新手快速入门系列教程五:基于JPA的一个Mysql简单读写例子

现在我们来做一个简单的读写Mysql的项目 1&#xff0c;先新建一个项目&#xff0c;我们叫它“HelloJPA”并且添加依赖 2&#xff0c;引入以下依赖&#xff1a; Spring Boot DevTools (可选&#xff0c;但推荐&#xff0c;用于开发时热部署)Lombok&#xff08;可选&#xff0c…

Google Earth Engine(GEE)——在控制台打印出来所选区域的缩略图

结果 函数 ui.Thumbnail(image, params, onClick, style) A fixed-size thumbnail image generated asynchronously from an ee.Image. Arguments: image (Image, optional): The ee.Image from which to generate the thumbnail. Defaults to an empty ee.Image. param…

简单分享下python多态

目录&#xff1a; 一、多态是啥嘞&#xff08;龙生九子各有不同&#xff0c;这就是多态&#xff09; 二、基础的实例 三、多态的优势与应用场景 四、深入理解 一、多态是啥嘞&#xff08;龙生九子各有不同&#xff0c;这就是多态&#xff09; 多态&#xff08;Polymorphism&…

Laravel5+mycat 报错 “Packets out of order”

背景 近期对负责项目&#xff0c;配置了一套 主从复制的 MySQL 集群 使用了中间件 mycat 但测试发现&#xff0c;替换了原来的数据连接后&#xff0c;会出现 Packets out of order 的报错 同时注意到&#xff0c;有的框架代码中竟然也会失效&#xff0c;比如 controller 类中&…

Mac电脑iTerm2 如何设置无限滑动

1.打开iTerm2应用 2.打开偏好设置 3.选中Profiles -> Terminal 4.选择Unlimited scrollback

Linux开发讲课33---线程实现与线程控制步骤简析

线程概述 进程是系统中程序执行和资源分配的基本单位。 每个进程都拥有自己的数据段、代码段和堆栈段&#xff0c;这就造成了进程在进行切换等操作时都需要有比较负责的上下文切换等动作。为了进一步减少处理机的空转时间支持多处理器和减少上下文切换开销&#xff0c;进程在演…

Ollama+OpenWeb UI搭建最简单的大模型交互界面

Open WebUI是一个专为大型语言模型&#xff08;LLMs&#xff09;设计的Web用户界面。这个界面提供了一个直观、响应迅速且易于使用的平台&#xff0c;使用户能够与本地运行的语言模型进行交互&#xff0c;就像与云服务中的模型交互一样。可以非常方便的调试、调用本地模型。你能…

Interpretability 与 Explainability 机器学习

「AI秘籍」系列课程&#xff1a; 人工智能应用数学基础人工智能Python基础人工智能基础核心知识人工智能BI核心知识人工智能CV核心知识 Interpretability 模型和 Explainability 模型之间的区别以及为什么它可能不那么重要 当你第一次深入可解释机器学习领域时&#xff0c;你会…

第十四届蓝桥杯省赛C++B组G题【子串简写】题解(AC)

题目大意 给定字符串 s s s&#xff0c;字符 a , b a, b a,b&#xff0c;问字符串 s s s 中有多少个 a a a 开头 b b b 结尾的子串。 解题思路 20pts 使用二重循环枚举左端点和右端点&#xff0c;判断是否为 a a a 开头 b b b 结尾的字符串&#xff0c;是则答案加一…

MyBatis1(JDBC编程和ORM模型 MyBatis简介 实现增删改查 MyBatis生命周期)

目录 一、JDBC编程和ORM模型 1. JDBC回顾 2. JDBC的弊端 3. ORM模型 Mybatis和hibernate 区别: 4. mybatis 解决了jdbc 的问题 二、MyBatis简介 1. MyBatis快速开始 1.1 导入jar包 1.2 引入 mybatis-config.xml 配置文件 1.3 引入 Mapper 映射文件 1.3 测试 …

构建滑块组件_第 2 部分

本篇我们继续学习滑块组件&#xff0c;让我们把滑块组件构建的更好&#xff1b; ● 首先&#xff0c;我们想要获取组件的三个点&#xff0c;首先在获取到他的HTML元素 const dotContainer document.querySelector(.dots);● 接着遍历 slides 数组&#xff0c;并在动态创建 元…

【MySQL】锁(黑马课程)

【MySQL】锁 0. 锁的考察点1. 概述1. 锁的分类1.1 属性分类1.2 粒度分类 2. 全局锁2.1 全局锁操作2.2.1 备份问题 3. 表级锁3.1 表锁3.2 语法3.3 表共享读锁&#xff08;读锁&#xff09;3.4 表独占写锁&#xff08;写锁&#xff09;3.5 元数据锁(meta data lock, MDL)3.6 意向…

分享实现地铁车辆侧面图

简介 通过伪类和关键帧动画实现地铁车辆侧面图 在线演示 伪元素和关键帧动画 实现代码 <!DOCTYPE html><html><head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <meta http-equiv"X-UA-Co…

【免费资料】IEEE33节点系统参数及拓扑图visio

主要内容 对于初学配电网的同学&#xff0c;最经典的系统即是33节点配电网系统&#xff0c;在各个研究文献中出现频次最高的也是这个系统&#xff0c;为了让大家更好了解33节点系统参数&#xff0c;本次整理了系统节点、支路参数excel以及33节点网络拓扑图visio&#xff0c…

org.springframework.jdbc.BadSqlGrammarException异常

Bug 记录 概述 在执行定时任务更新电子书统计信息时&#xff0c;遇到了 org.springframework.jdbc.BadSqlGrammarException 异常&#xff0c;具体表现为 SQL 函数 count 被错误地解析为自定义函数 wiki.count&#xff0c;导致数据库更新操作失败。 详细描述 错误信息&#x…

adb不插usb线通过wifi调试

说起做手机开发也有好多年了&#xff0c;说来惭愧&#xff0c;我最近才知道安卓手机是可以不插数据线进行开发调试的。起因是公司近期采购了一批安卓一卡通设备&#xff0c;需要对其进行定制开发APP,但是由于我插USB调试发现没有反应。通过询问厂家才知道可以通过WIFI进行调试。…

Gradient Descent

在整个maching learning的第三个步骤要找一个最好的function。在第二步是定义了一个 Loss function L&#xff0c;这个L是一个function的fuction 求完偏微分之后得到的向量就是Gradient&#xff08;黄色部分&#xff09; 随机找一个起始点0&#xff0c;它的等高线的法线方向就…

Flash存储器解析:从原理到应用,全面了解其与缓存的区别

Flash存储器解析&#xff1a;从原理到应用&#xff0c;全面了解其与缓存的区别 Flash存储器是一种非易失性存储器技术&#xff0c;广泛应用于各种电子设备中&#xff0c;如USB闪存盘、固态硬盘&#xff08;SSD&#xff09;、智能手机、数码相机和嵌入式系统。它能够在断电情况下…

Windows使用nxlog发送系统日志到Linux的rsyslog服务器

Windows使用nxlog发送系统日志到Linux的rsyslog服务器 前言一、IP地址规划及示意图二、在windows上安装及配置nxlog1.下载nxlog2.安装nxlog3.配置nxlog4.创建对应日志路径的文件夹 三、windows上启动nxlog服务四、在CentOS 7上配置日志存到指定位置文件1.编辑/etc/rsyslog.conf…