本文已整合到C语言标准库深度解读

文章目录

  • 查询函数
  • 比较函数
  • 复制和追加
  • 本地函数

为了看上去规整简洁,令

#define cSTR const char *str
#define vSTR const void *str

由于字符串自身存在终止符\0,所以下面所有提及对字符串前n个字符的操作,均默认n小于字符串长度;若n大于字符串长度,则对字符串整体进行操作。

首先,由于C语言中的字符串无非是终止于\0的字符数组,数组中并未给我们提供任何长度信息,所以要有一个函数来计算字符串长度,此即

size_t strlen(cSTR)

然后认识一下用于分割字符串的strtok

char *strtok(char *str, const char *delim)

其功能为通过delimstr分解为一组小字符串,所谓分解,其实就是将分割符号替换为\0;然后返回被分割之后的第一个字符串。

如果strtok已经对某个字符串进行分割了,那么接下来需要将其表达式写为strtok(NULL, delim),这样可以逐一调出被分割的字符串。

//teststrtok.c
#include<stdio.h>
#include<string.h>int main(){char oldStr[50] = "I am micro tiny cold";const char s[2] = " ";printf("str length: %d\n", strlen(oldStr));char* newStr = strtok(oldStr,s);while(newStr != NULL){printf("the oldStr is %s.\t", oldStr);printf("the newStr is %s with length : %d\n", newStr, strlen(newStr));newStr = strtok(NULL, s);}return 0;
}

测试结果为

>gcc testStrtok.c
>a.exe
str length: 20
the oldStr is I.        the newStr is I with length : 1
the oldStr is I.        the newStr is am with length : 2
the oldStr is I.        the newStr is micro with length : 5
the oldStr is I.        the newStr is tiny with length : 4
the oldStr is I.        the newStr is cold with length : 4

接下来将string.h中的函数分为四个类别,分别是查询比较复制和追加以及本地函数

查询函数

查询函数 返回 类型
void *memchr(vSTR, int c, size_t n) strn个字节中首次出现c的位置 指针
char *strchr(cSTR, int c) str首次出现c的位置 指针
char *strrchr(cSTR, int c) str最后出现c的位置 指针
char *strstr(cSTR1, cSTR2) str1中首次次出现字符串str2的位置 指针
char *strpbrk(cSTR1, cSTR2) str1中首个个属于str2的字符的位置 指针
size_t strspn(cSTR1, cSTR2) str1中第一个不属于str2的字符的索引 整数
char *strerror(int errnum) 根据错误号errnum索引错误名
详见errno.h

比较函数

比较函数 返回
int memcmp(vSTR1, vSTR2, size_t n) 比较str1str2的前n个字节
int strncmp(cSTR1, cSTR2, size_t n) 比较str1str2的前n个字符
int strcmp(cSTR1, cSTR2) 比较str1str2
size_t strcspn(cSTR1, cSTR2) str1开头连续不含str2中字符的个数

注意

有关字符串str1str2的比较中:

  • 若二者相等,则返回0
  • 若str1<str2,则返回值小于0
  • 若str1>str2,则返回值大于0

复制和追加

下面用于字符串复制的函数,均返回一个指向目标字符串的指针。

复制
char *strcpy(char *dest, vSTR) str复制到dest
char *strncpy(char *dest, cSTR, size_t n) strn个字符复制到 dest
void *memset(void *str, int c, size_t n) str的前n个字符设为c
void *memcpy(void *dest, vSTR, size_t n)
void *memmove(void *dest, vSTR, size_t n)
str的前n个字节复制到dest

其中,strncpy是对字符串的操作,而memcpy是对内存块的操作。

如果内存块发生重叠,memmove可以保证源字符串被覆盖之前,将重叠区域的字节复制到目标区域,所以比memcpy更加安全。

所谓追加,无非是将一个字符串的内容复制到另一个字符串的结尾,本质上也可称为广义的复制。

追加
char *strcat(char *dest, cSTR) str追加到dest结尾。
char *strncat(char *dest, cSTR, size_t n) str的前n个字符追加到dest结尾

本地函数

这里所谓的本地函数,就是受到locale.hLC_COLLATE影响的函数,其功能和返回值取决于当前所在的地区。string.h中共有两个本地函数,分别是用于字符串比较的strcoll和用于更改字符串格式的strxfrm

对于前者,若我们想对一组汉字按照拼音进行排序,那么就要用到strcoll,其声明为

int strcoll(cSTR1, cSTR2)

做一个测试

//testStrcoll.c
#include <stdio.h>
#include <string.h>
#include <locale.h>void printStrcoll(const char *str1, const char *str2){if(strcoll(str1,str2)>0)printf("%s>%s\n",str1, str2);elseprintf("%s<%s\n",str1, str2);
}int main (void)
{printf ("默认比较:");printStrcoll("甲","乙");setlocale (LC_ALL, "");printf ("拼音比较:");printStrcoll("甲","乙");return 0;
}

编译运行结果,由于我实在不熟悉汉字编码顺序,所以其内码比较和拼音比较的结果是一样的。另外,本程序用的是gcc11.2进行编译的,低于10的版本可能会出现汉字乱码的情况。

>gcc testStrcoll.c
>a.exe
默认比较:甲>乙
拼音比较:甲>乙

另一个本地函数声明为

size_t strxfrm(char *dest, cSTR, size_t n)

其功能就是简单的将str的前n个字符转换为本地形式后复制到dest中,返回值是被转换的字符长度。

关于setlocale 函数,详情请阅通过locale.h设置美元的格式。

C语言字符串string.h详解相关推荐

  1. C语言用函数字符串的查找,字符串查找函数,C语言字符串查找函数详解

    在对 C 语言的编程实践中,字符串查找是最频繁的字符串操作之一,本节就对常用的字符串查找函数做一个简单的总结. 使用 strchr 与 strrchr 函数查找单个字符如果需要对字符串中的单个字符进行 ...

  2. c语言 string.h 详解

    http://www.cnblogs.com/rosesmall/archive/2012/03/27/2419318.html

  3. string教程c语言,C++ string类详解

    C++ 大大增强了对字符串的支持,除了可以使用C风格的字符串,还可以使用内置的 string 类.string 类处理起字符串来会方便很多,完全可以代替C语言中的字符数组或字符串指针. string ...

  4. C语言字符串函数的详解

    一.字符串具体有哪些 求字符串的长度 strlen 长度不受限制的字符串函数 strcpy strcat strcmp 长度受限制的字符串函数介绍 strncpy strncat strncmp 字符 ...

  5. string.Compare字符串比较函数中文详解以及与Equal、==的区别

    Chinar blog :www.chinar.xin String 比较函数详解 本文提供全流程,中文翻译 助力快速理解 String 字符串比较函数的区别 为初学者节省宝贵的时间,避免采坑! Ch ...

  6. c语言printf函数中的格式控制字符串,C++_C语言格式化输入输出函数详解,一:格式输出函数printf() 1 - phpStudy...

    C语言格式化输入输出函数详解 一:格式输出函数printf() 1.调用形式一般为:printf("格式化控制字符串",输出表列): 2.格式化控制字符串用于指定输出格式,它有三种 ...

  7. 转载:c+string类详解

    C++ string 类详解 </h1><div class="clear"></div><div class="postBod ...

  8. 转: std::string用法详解

    原文地址为: 转: std::string用法详解  C++中的string 类 简单介绍 前言: string 的角色 1 string 使用 1.1 充分使用string 操作符 1.2 眼花缭乱 ...

  9. c语言比特和字节,详解 比特(位,bit),字节(Byte),字符的区别 *(转)

    比特(位):英文bit,是计算机晶体管的一种状态(通电与断电).就是0与1,真与假,是计算机最基本的传输单位. 示例: 2bit : 10; 4bit : 1111; 8bit : 1111 1111 ...

最新文章

  1. python生成器单线程_【Python】迭代器、生成器、yield单线程异步并发实现详解
  2. 【算法】图文并茂,一文了解 8 种常见的数据结构
  3. c语言mfc弹出窗口函数,CMFCDesktopAlertWnd实现桌面弹出消息框
  4. 百度顶会论文复现(3):视频分类综述
  5. c语言中标识符和关键字,C语言(三) C 标识符和关键字
  6. “精耕细作”桌面云市场的锐捷,重磅发布三擎云桌面
  7. 「超级右键」Mac必备的一款软件,新手get!
  8. 多旋翼飞行器控制的难点
  9. 我老公38岁每晚跑步,身体没变好,衰老还加速了,咋回事?
  10. iRedMail在Debian或Ubuntu Linux上的安装
  11. centos修改键盘布局
  12. python编译 pyd 工具_windows平台 python生成 pyd文件
  13. 《金融怪杰》读书笔记
  14. OSI网络模型,IO模型,BIO模型,NIO模型,AIO模型,TCP/IP协议
  15. Python 小小爬虫练手,爬取自己的IP
  16. 软考高级系统架构设计师系列之:详细整理高级系统架构设计师核心知识点
  17. maxwell启停脚本
  18. 23款精美的HTML5网站模板免费下载
  19. 怎么给电脑重装win7系统,win7系统怎么安装?
  20. 行业分析| 智慧消防对讲

热门文章

  1. NXP S32K1 时钟系统
  2. ubuntu重新获取IP地址
  3. 提高PLC编程能力的6种电路,新手必学!
  4. 就业指导——自我介绍与个人简历
  5. 1200PLC与施耐德变频器通讯程序,带注释
  6. cuda2 向量加法
  7. ubantu关机快捷键_ubuntu常用命令及快捷键整理
  8. windows10搭建CUDA环境并运行示例
  9. 关于单片机固件升级的理论基础
  10. FFT算法再学以及终于理解