自学嵌入式第十四天C语言篇13

目录

指针+一维字符型数组

const用法

处理字符串

memcpy


指针+一维字符型数组

const用法

const char *s const表示只读 此时const限定的是基类型,表示不能通过*s的方式修改基类型。

char const *s 此时还是const限定的是基类型,表示不能通过*s的方式修改基类型。

char * const s 此时const限定指针变量s,表示s只读,不能修改指针变量s

就近原则:const离谁近就限定谁

应用:1.如果不想通过*p方式修改基类型对应的数据,就选择const int * p;

2.指针变量p定义好后,不想再指向别的变量,就选择int *const p;

使用const的好处:

1.能提前发现代码中的问题,将运行时的问题提前到编译时显示出来

2.能够接收可修改变量和常量两种。

处理字符串

以下是用指针完成的与字符串相关的函数的代码

cs 复制代码
//puts输出字符串
int Puts(const char *s)
{
	if (s == NULL)
	{
		return -1;
	}
	
	while (*s != '\0')
	{
		printf("%c",*s);
		s++;
	}

	putchar('\n');

	return 0;
}

//gets从键盘获取字符串,存到s中,返回s的首地址
char *Gets(char *s)
{
	char *ret = s;

	while ((*s = getchar()) != '\n')
	{
		s++;
	}

	*s = '\0';

	return ret;
}

//strlen计算字符串中的长度,返回长度
int Strlen(const char *s)
{
	int len = 0;

	while (*s != '\0')
	{
		len++;
		s++;
	}

	return len;
}

//strcpy将源字符串复制到目标字符串
char *Strcpy(char *dest,const char *src)
{
	char *ret = dest;

	while (*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}

	*dest = '\0';

	return ret;
}

//strncpy复制源目标字符串中的n个字符,如果n大于原字符串的长度,目标字符串能被称为字符串,n小于源字符串长度时,只保证复制了n个字符,目标字符数组中不一定有停止标志
char *Strncpy(char *dest,const char *src,size_t n)
{
	char *ret = dest;

	while (n--)
	{
		if (*src != '\0')
		{
			*dest = *src;
			dest++;
			src++;
		}
		else
		{
			*dest = '\0';
			dest++;
		}
	}

	return ret;
}

//strcat拼接字符串
char *Strcat(char *dest,const char *src)
{
	char *ret = dest;

	while (*dest != '\0')
	{
		dest++;
	}

	while (*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}

	*dest = '\0';

	return ret;
}

//可以控制要将源字符串中的几个字符拼接过去,并一定构成字符串
char *Strncat(char *dest,const char *src,size_t n)
{
	char *ret = dest;

	while (*dest != '\0')
	{
		dest++;
	}

	while (n && *src != '\0')
	{
		*dest = *src;
		src++;
		dest++;
		n--;
	}

	*dest = '\0';

	return ret;
}

//strcmp比较两个字符串的大小
int Strcmp(const char *s1,const char *s2)
{
	while (*s1 == *s2 && *s1 != '\0' && *s2 != '\0')
	{
		s1++;
		s2++;
	}

	return *s1 - *s2;
}

//可以规定比较的范围
int Strncmp(const char *s1,const char *s2,size_t n)
{
	while (*s1 == *s2 && *s1 != '\0' && *s2 != '\0' && --n)
	{
		s1++;
		s2++;
	}

	return *s1 - *s2;
}

补充:为什么strcpy和strcat要设计成返回字符串的首地址?

再变量中定义了a,b,c;可以完成连续赋值,即a=b=c=10;这两个函数设计成返回字符串的首地址也是为了可以完成类似操作,即链式操作,如 strcpy(s1,strcpy(s2,"hello"));

memcpy

memcpy也能完成字符串的复制,但其功能更强大的地方在于,它不止能完成字符串的复制,任意类型的数组都能进行复制,完成过程如下:

cs 复制代码
//memcpy完成过程
void *Memcpy(void *dest,const void *src,size_t n)
{
	char *p = (char *)dest;    //dest为空类型,memcpy是一个字节一个字节进行复制,所以将其强转成char *类型
	const char *q = (char *)src;

	while (n)
	{
		*p = *q;
		p++;
		q++;
		n--;
	}
}
相关推荐
程序员小白条1 分钟前
0经验如何找实习?
java·开发语言·数据结构·数据库·链表
liulilittle7 分钟前
C++ 浮点数封装。
linux·服务器·开发语言·前端·网络·数据库·c++
失散1343 分钟前
Python——1 概述
开发语言·python
萧鼎1 小时前
Python 图像哈希库 imagehash——从原理到实践
开发语言·python·哈希算法
小小8程序员1 小时前
STL 库(C++ Standard Template Library)全面介绍
java·开发语言·c++
立志成为大牛的小牛1 小时前
数据结构——五十六、排序的基本概念(王道408)
开发语言·数据结构·程序人生·算法
老王熬夜敲代码1 小时前
C++中的atomic
开发语言·c++·笔记·面试
a努力。2 小时前
腾讯Java面试被问:String、StringBuffer、StringBuilder区别
java·开发语言·后端·面试·职场和发展·架构
长安第一美人2 小时前
php出现zend_mm_heap corrupted 或者Segment fault
开发语言·嵌入式硬件·php·zmq·工业应用开发
gihigo19982 小时前
基于MATLAB的电力系统经济调度实现
开发语言·matlab