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

简介: 嵌入式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


分割字符串


0a2653c851af460fa595bd959398a8f1.png


strcpy //不安全,容易越界访问,只支持字符串拷贝,不支持其他类型

memcpy 拷贝任意类型

memset 清零

bzero 清空

atoi 字符串变整型数字


编程练习


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

题目:实现strtok

相关文章
|
9月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
860 2
|
网络协议 算法 Linux
【嵌入式软件工程师面经】Linux网络编程Socket
【嵌入式软件工程师面经】Linux网络编程Socket
745 1
|
消息中间件 Linux C++
c++ linux通过实现独立进程之间的通信和传递字符串 demo
的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。 在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方
428 16
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
900 15
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
782 13
|
Linux Python Perl
Linux命令删除文件里的字符串
Linux命令删除文件里的字符串
471 8
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
1209 3
|
JavaScript 关系型数据库 Shell
Linux shell编写技巧之随机取字符串(一)
本文介绍了Linux Shell脚本的编写技巧,包括环境配置、变量命名规则和缩进语法,并提供了一个实例练习,展示如何使用`$RANDOM`变量和`md5sum`命令来生成随机的8位字符串。
384 4
|
Linux Perl
Linux进行文件字符串替换
【8月更文挑战第5天】Linux进行文件字符串替换
1659 3
|
Ubuntu 算法 Linux
嵌入式Linux的学习误区
**嵌入式Linux学习误区摘要** 1. **过度聚焦桌面Linux** - 许多学习者误将大量时间用于精通桌面Linux系统(如RedHat、Fedora、Ubuntu),认为这是嵌入式Linux开发的基石。 - 实际上,桌面Linux仅作为开发工具和环境,目标不应是成为Linux服务器专家,而应专注于嵌入式开发工具和流程。 2. **盲目阅读Linux内核源码** - 初学者在不了解Linux基本知识时试图直接研读内核源码,这往往导致困惑和挫败感。 - 在具备一定嵌入式Linux开发经验后再有针对性地阅读源码,才能有效提升技能。
309 4