嵌入式Linux C(六)——字符串

一、前言

字符串就是首字符的地址

char *ptr = "hello world";//保存在数据段的or段,改数据不能被修改(常量字符串,不能被修改)

char src[100] = "hello world";//保存在栈

char *str = (char *) malloc(sizeof(char) * 100);//保存在堆

strcpy(str,"hello world");

二、字符串函数

2.1 strlen字符串长度函数

char *ptr = "hello world";

char src[100] = "hello world";

char *str = (char *) malloc(sizeof(char) * 100);

if(NULL == str)
{
	printf("malloc error!");
	exit(1);
}

size_t len = strlen(src);//返回是长整型
printf("%ld",len);

//实现

size_t my_strlen(const char *s)
{
	size_t len = 0;
	whlie(*s != '\0')
	{
		len++;
		s++;
	}
	return len;
}

2.2 strcpy、strncpy字符串拷贝函数

char src[100] = "hello world";

char *dest = (char *) malloc(sizeof(char) * 100);

if(NULL == dest)
{
	printf("malloc error!\n");
	exit(1);
}

char *temp = strcpy(dest,src);//返回dest的首字符地址
//存在风险,无法确定dest是否大于src。
//微软推荐strcpy_s(char *dest,int len,char *src)len就是dest的长度

if(NULL == temp)//相对于my_strcpy而言
{
		printf("my strcpy is error!\n");
		exit(1);
}

//实现my_strcpy
char *my_strcpy(char *dest,char *src)
{
	if(NULL  == dest || NULL == src)
	{
		return NULL;
	}
	char *temp = dest;//需要有个temp进行移动
	
	whlie(*src != '\0')
	{
		*temp = *src;
		src++;
		temp++;
	}
	*dest = '\0';
	return dest;
}

//my_str_strncpy

char *my_strncpy(char *dest,char *src,size_t n)
{
	if(NULL  == dest || NULL == src)
	{
		return NULL;
	}
	int i;
	char *temp = dest;
	
	for(i = 0; (i < n) && (*src != '\0'); i++)
	{
		*temp = *src
		src++;
		temp++;
	}
	for(;i < n;i++)
	{
		*temp = '\0';
		temp++;
	}
	return dest;
}

2.3 strcat、strncat字符串链接函数

dest还是有风险

//实现my_strcat
char *my_strcat(char *dest,char *src)
{
	if(NULL  == dest || NULL == src)
	{
		return NULL;
	}
	char *temp = dest;
	while(*temp != '\0')
	{
		temp++;
	}
	
	while(*src != '\0')
	{
		*temp = *src;
		temp++;
		src++;
	}
	*temp = '\0';
	return dest;
}

//实现my_strcat
char *my_strncat(char *dest,char *src,size_t n)
{
	if(NULL  == dest || NULL == src)
	{
		return NULL;
	}
	char *temp = dest;
	while(*temp != '\0')
	{
		temp++;
	}
	
	for(int i = 0; (i < n) && (*src != '\0'); i++)
	{
		*temp = *src;
		temp++;
		src++;
	}
	*temp = '\0';
	return dest;
}

2.4 strcmp、strncmp字符串比较函数

//实现

int my_strcmp(char *s1,char *s2)
{
	if(NULL == s1 && NULL != s2)
	{
		return -1;
	}
	if(NULL != s1 && NULL == s2)
	{
		return 1;
	}
	if(NULL == s1 && NULL == s2)
	{
		return 0;
	}
	while(*s1 != '\0' &&)
	{
		if(*s1 > *s2)
		{
			return 1;
		}
		if(*s1 < *s2)
		{
			return 0;
		}
		s1++;
		s2++;
	}
	
	if(*s1 == '\0' && *s2 == '\0')
	{
		return 0;
	}
	if(*s1 != '\0' && *s2 == '\0')
	{
		return 1;
	}
	if(*s1 == '\0' && *s2 != '\0')
	{
		return -1;
	}
	return 0;
}
//实现strncmp
int my_strncmp(char *s1,char *s2,size_n)
{
	if(NULL == s1 || s2 == NULL)
	{
		return -1;
	}
	for(int i = 0; (i < n) && ((s1[i] != '\0') && (s2 != '\0')); i++)
	{
		if(s1[i] != s2[i])
		{
			return -1;
		}
	}
	return 0;
}

2.5 strchr、strrchr、strpbrk字符串函数

stecasecmp 忽略大小写比较字符串
strchr 查找字符串中第一个出现的指定字符
strrchr 查找字符串中最后一个出现的指定字符
strpbrk 查找字符串中第一个出现的指定字符

补充

strspn

返回字符串中连续不含指定字符串内容的字符数

统计s1中任意一个字符不在s2中出现的字符小标
字典

strstr

在一字符串查找指定的字符串

strtok

分割字符串
在这里插入图片描述

strcpy //不安全,容易越界访问,只支持字符串拷贝,不支持其他类型
memcpy 拷贝任意类型
memset 清零
bzero 清空
atoi 字符串变整型数字

编程练习

题目:在字符串中寻找特定字符串


题目:实现strtok

posted @ 2022-01-15 21:10  周末不下雨  阅读(36)  评论(0编辑  收藏  举报