linux内核驱动中对字符串的操作【转】

简介:

转自:http://www.360doc.com/content/12/1224/10/3478092_255969530.shtml

Linux内核中关于字符串的相关操作,首先包含头文件:

  1. #include <linux/string.h>  

可用函数包括如下:
lib/string.c
 

  1. int strnicmp(const char *s1, const char *s2, size_t len)  
  2. int strcasecmp(const char *s1, const char *s2)  
  3. int strncasecmp(const char *s1, const char *s2, size_t n)  
  4. char *strcpy(char *dest, const char *src)  
  5. char *strncpy(char *dest, const char *src, size_t count)  
  6. size_t strlcpy(char *dest, const char *src, size_t size)  
  7. char *strcat(char *dest, const char *src)  
  8. char *strncat(char *dest, const char *src, size_t count)  
  9. size_t strlcat(char *dest, const char *src, size_t count)  
  10. int strcmp(const char *cs, const char *ct)  
  11. int strncmp(const char *cs, const char *ct, size_t count)  
  12. char *strchr(const char *s, int c)  
  13. char *strrchr(const char *s, int c)  
  14. char *strnchr(const char *s, size_t count, int c)  
  15. char *skip_spaces(const char *str)  
  16. char *strim(char *s)  
  17. size_t strlen(const char *s)  
  18. size_t strnlen(const char *s, size_t count)  
  19. char *strpbrk(const char *cs, const char *ct)  
  20. char *strsep(char **s, const char *ct)  
  21. bool sysfs_streq(const char *s1, const char *s2)  
  22. void *memset(void *s, int c, size_t count)  
  23. void *memcpy(void *dest, const void *src, size_t count)  
  24. void *memmove(void *dest, const void *src, size_t count)  
  25. int memcmp(const void *cs, const void *ct, size_t count)  
  26. void *memscan(void *addr, int c, size_t size)  
  27. char *strstr(const char *s1, const char *s2)  
  28. char *strnstr(const char *s1, const char *s2, size_t len)  
  29. void *memchr(const void *s, int c, size_t n)  

用法说明:

int strnicmp(const char *s1, const char *s2, size_t len)
功能:比较字符串s1和s2的前len个字符串的大小,不区分字母大小写。
返回:返回的是字符串s1与s2能比较出大小的那个字符转换成小写后两者的差值。相等返回0。

int strcasecmp(const char *s1, const char *s2)
功能:比较字符串s1和s2的大小,同样不区分大小写。
返回:返回的是字符串s1与s2能比较出大小的那个字符转换成小写后两者的差值。相等返回0
注意:这儿字符串s1的长度应该大于s2的长度。
 

int strncasecmp(const char *s1, const char *s2, size_t n)
功能:比较字符串s1和s2的前n个字符串的大小,不区分字母大小写。
返回:返回的是字符串s1与s2能比较出大小的那个字符转换成小写后两者的差值。相等返回0
 

char *strcpy(char *dest, const char *src)
功能:把src所指的以NULL结束的字符串复制到dest所指的字符串中。
返回:返回指向dest的指针。 
注意:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 
 

char *strncpy(char *dest, const char *src, size_t count)
功能:将字符串src中最多count个字符复制到字符数组dest中(它并不像strcpy一样遇到NULL才停止复制,而是等凑够count个字符才停止复制),返回指向dest的指针。 
返回:返回指向dest的指针。
注意: 
如果count > dest串长度,dest栈空间溢出产生崩溃异常。 
否则: 
1)src串长度<=dest串长度,(这里的串长度不包含串尾NULL字符) 
如果count = [0, src串长度],src的前count个字符复制到dest中。但是由于没有NULL字符,所以直接访问dest串会发生栈溢出的异常情况。 
这种情况一般这样使用:
count = src串长度+1,连src的NULL字符一起复制。 
count = dest串长度,[0,src串长度]处存放src字串,[src串长度, dest串长度]处存放NULL。 
2)src串长度 > dest串长度 
如果count = dest串长度,则dest串没有NULL字符,会导致输出会有乱码。如果不考虑src串复制完整性,可以将dest最后一字符置为NULL。
 
 
size_t strlcpy(char *dest, const char *src, size_t size)
功能:把src所指的由NULL结束的字符串最多size个字符复制到dest所指的字符串中。
返回:返回指向dest的指针。
注意:strlcpy比strncpy能更好的处理NULL事件,然而strlcpy不是ANSI C函数,一般在linux下使用
因此建议在linux驱动中使用strlcpy函数。
 

char *strcat(char *dest, const char *src)
功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的’\0’)并添加'\0'。 
返回:返回指向dest的指针。
注意:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
  

char *strncat(char *dest, const char *src, size_t count)
功能:把src所指字符串的前count个字符添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'。
返回:返回指向dest的指针。 
注意:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 
 

size_t strlcat(char *dest, const char *src, size_t count)
功能:把src所指字符串的前count个字符添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'。
返回:返回指向dest的指针。 
注意:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。同样建议使用strlcat而不是strncat。

int strcmp(const char *cs, const char *ct)
功能:比较字符串cs和ct的大小,区分大小写。 
返回:返回的是字符串s1与s2能比较出大小的那个字符两者的差值。相等返回0。
注意:比较的最长长度为字符串cs的长度。

int strncmp(const char *cs, const char *ct, size_t count)
功能:比较字符串cs和ct前n个字符串的大小,区分大小写。 
返回:返回的是字符串s1与s2能比较出大小的那个字符两者的差值。相等返回0。
注意:比较的最长长度为字符串cs的长度。

char *strchr(const char *s, int c)
功能:查找字符串s中首次出现字符c的位置 。
返回:如果字符c出现在字符串s中,则返回首次出现c的位置的指针,如果没有出现,则返回NULL。

char *strrchr(const char *s, int c)
功能:查找字符c在字符串s中末次出现的位置。
返回:从字符串s中的最后出现出字符c位置的指针,如果没出现,返回NULL。

char *strnchr(const char *s, size_t count, int c)
功能:查找字符c在字符串s前count个字符中首次出现的位置。
返回:从字符串s中的前count字符中出现出字符c位置的指针,如果没出现,返回NULL。

char *skip_spaces(const char *str)
功能:除去字符串str首部的空格字符。
返回:除去空格字符的字符串指针。

char *strim(char *s)
功能:除去字符串str首部与尾部的空格字符。
返回:除去空格字符的字符串指针。

size_t strlen(const char *s)
功能:计算字符串s的长度,不包括'\0'在内。
返回:返回s的长度,不包括结束符NULL。

size_t strnlen(const char *s, size_t count)
功能:计算字符串s的长度,这个长度最大计数为count,不包括'\0'在内。
返回:返回s的长度,不包括结束符NULL。

char *strpbrk(const char *cs, const char *ct)
功能:在字符串cs中寻找字符串ct中任何一个字符相匹配的第一个字符的位置,空字符NULL不包括在内。
返回:返回字符串cs中指向第一个位置字符串指针。

char *strsep(char **s, const char *ct)
功能:以字符串ct分解字符串s指向字符串指针所指向的字符串。
返回:返回s指向的字符串按ct分解的前面字符串(不包含ct),s指向了按ct分解的后面字符串(不包含ct)。

bool sysfs_streq(const char *s1, const char *s2)
功用:判断字符串s1与字符串s2是否相等。
返回:如果相等,返回真;否则返回假。
注意:本函数更多用于linux 通过sysfs输入的字符串,当使用echo命令时,如:echo 1024 > /sys/module/e1000/parameters/copybreak,echo命令通常会在尾部附加一个’\n’字符。举例,s1 = “abdc\n”,s2 = “abdc”,则判定s1与s2是相等的。而s1 = “abdc\nd”,s2 = “abdc”,则s1 != s2。

void *memset(void *s, int c, size_t count)
功能:将s指向的count单位(一个字节为一个单位)内存空间以字符c填充。
返回:无。
注意:memset用于常规内存。如果要对IO内存操作,则用memset_io(void *s,int c,size_t count)

void *memcpy(void *dest, const void *src, size_t count)
功能:从src指向的内存的内容复制count单位(一个字节为一个单位)到dest指向的内存区域。
返回:无。
注意:两个内存区域不能重叠,如果要对IO内存使用,则用memcpy_fromio( )。

void *memmove(void *dest, const void *src, size_t count)
功能:从src指向的内存的内容复制count单位(一个字节为一个单位)到dest指向的内存区域。
返回:无。
注意:两个内存区域可以重叠,如果要对IO内存使用,则用memcpy_fromio( )。

int memcmp(const void *cs, const void *ct, size_t count)
功能:比较两个内存区域的前count单位(字节)。
返回:当cs < ct时,返回值<0 ;当cs = ct时,返回值=0;当cs > ct时,返回值>0。返回的具体值为两个内存区域能比较大小的内存单元的内容的差值,比较还是以char比较的。

void *memscan(void *addr, int c, size_t size)
功能:在内存区域中查找第一次出现字符c的位置,最多查找size单位。
返回:返回位置指针;如果没有出现,返回size单位后的内存指针。

char *strstr(const char *s1, const char *s2)
功能:在字符串s1查找第一次出现字符串s2(包含s2除NULL的其他全部内容)的位置。
返回:返回位置指针;如果没有出现,返回NULL。

char *strnstr(const char *s1, const char *s2, size_t len)
功能:在字符串s1查找第一次出现字符串s2(包含s2除NULL的其他全部内容)的位置,最多查找len长度。
返回:返回位置指针;如果没有出现,返回NULL。

void *memchr(const void *s, int c, size_t n)
功能:在内存区域中查找第一次出现字符c的位置,最多查找size单位。
返回:返回位置指针;如果没有出现,返回NULL。













本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/4826009.html,如需转载请自行联系原作者

相关文章
|
安全 网络协议 Linux
深入理解Linux内核模块:加载机制、参数传递与实战开发
本文深入解析了Linux内核模块的加载机制、参数传递方式及实战开发技巧。内容涵盖模块基础概念、加载与卸载流程、生命周期管理、参数配置方法,并通过“Hello World”模块和字符设备驱动实例,带领读者逐步掌握模块开发技能。同时,介绍了调试手段、常见问题排查、开发规范及高级特性,如内核线程、模块间通信与性能优化策略。适合希望深入理解Linux内核机制、提升系统编程能力的技术人员阅读与实践。
1076 1
|
Ubuntu Linux
Ubuntu 23.04 用上 Linux 6.2 内核,预计下放到 22.04 LTS 版本
Linux 6.2 带来了多项内容更新,修复了 AMD 锐龙处理器设备在启用 fTPM 后的运行卡顿问题,还增强了文件系统。
|
Ubuntu Linux
Ubuntu 23.10 现在由Linux内核6.3提供支持
如果你想在你的个人电脑上测试一下Ubuntu 23.10的最新开发快照,你可以从官方下载服务器下载最新的每日构建ISO。然而,请记住,这是一个预发布版本,所以不要在生产机器上使用或安装它。
|
传感器 监控 Ubuntu
10 月发布,Ubuntu 23.10 已升级到 Linux Kernel 6.3 内核
硬件方面,Linux 6.3 引入了在 HID 中引入了原生的 Steam Deck 控制器接口,允许罗技 G923 Xbox 版赛车方向盘在 Linux 上运行;改善 8BitDo Pro 2 有线控制器的行为;并为一系列华硕 Ryzen 主板添加传感器监控。
|
Ubuntu Linux
Ubuntu24.04LTS默认采用Linux 6.8内核,实验性版本可通过PPA获得
IT之家提醒,当下的 Ubuntu 23.10 也是一个“短期支持版本”,该版本将在今年 7 月终止支持,而今年 4 月推出的 Ubuntu 24.04 LTS 长期支持版本将获得 5 年的更新支持。
|
12月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
1039 2
|
监控 Ubuntu Linux
什么Linux,Linux内核及Linux操作系统
上面只是简单的介绍了一下Linux操作系统的几个核心组件,其实Linux的整体架构要复杂的多。单纯从Linux内核的角度,它要管理CPU、内存、网卡、硬盘和输入输出等设备,因此内核本身分为进程调度,内存管理,虚拟文件系统,网络接口等4个核心子系统。
1167 0
|
Web App开发 缓存 Rust
|
Ubuntu 安全 Linux
Ubuntu 发行版更新 Linux 内核,修复 17 个安全漏洞
本地攻击者可以利用上述漏洞,攻击 Ubuntu 22.10、Ubuntu 22.04、Ubuntu 20.04 LTS 发行版,导致拒绝服务(系统崩溃)或执行任意代码。