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;
}

相关推荐
HABuo6 小时前
【linux文件系统】磁盘结构&文件系统详谈
linux·运维·服务器·c语言·c++·ubuntu·centos
2401_8589368811 小时前
【Linux C 编程】标准 IO 详解与实战:从基础接口到文件操作实战
linux·c语言
季明洵14 小时前
C语言实现单链表
c语言·开发语言·数据结构·算法·链表
浅念-14 小时前
C语言编译与链接全流程:从源码到可执行程序的幕后之旅
c语言·开发语言·数据结构·经验分享·笔记·学习·算法
爱吃生蚝的于勒14 小时前
【Linux】进程信号之捕捉(三)
linux·运维·服务器·c语言·数据结构·c++·学习
The森14 小时前
Linux IO 模型纵深解析 01:从 Unix 传统到 Linux 内核的 IO 第一性原理
linux·服务器·c语言·经验分享·笔记·unix
C++ 老炮儿的技术栈15 小时前
Qt 编写 TcpClient 程序 详细步骤
c语言·开发语言·数据库·c++·qt·算法
wangjialelele16 小时前
Linux下的IO操作以及ext系列文件系统
linux·运维·服务器·c语言·c++·个人开发
wengqidaifeng18 小时前
数据结构(三)栈和队列(上)栈:计算机世界的“叠叠乐”
c语言·数据结构·数据库·链表
VekiSon19 小时前
Linux内核驱动——设备树原理与应用
linux·c语言·arm开发·嵌入式硬件