嵌入式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