重点知识速览

一、字符串拷贝
strcpy(地址1(目标地址),地址2(要拷贝的地址)) ; //拷贝地址的字符串
strncpy(地址1(目标地址),地址2(要拷贝的地址),拷贝前n个字节) ; //拷贝地址的前n个字符串
二、内存拷贝
memcpy(地址1(目标地址),地址2(要拷贝的地址),拷贝前n个字节) ; //拷贝地址前n个字节的内存
memccpy(地址1(目标地址),地址2(要拷贝的地址),标志,拷贝前n个字节) ; //拷贝地址前n个字节的内存,返回标志位下一个字节的地址
三、字符串比较
strcmp(字符串1地址,字符串2地址) ; //比较字符串的大小
strchr(字符串地址,指定的字符) ; //在一个字符串中查找指定的字符
strstr(字符串1地址,字符串2地址) ; //在一个字符串中查找指定的字符串
四、内存比较
memcmp(字符串1地址,字符串2地址,前n个字符) ; //比较内存前n个字符
五、字符串长度
strlen(字符串地址) ; //计算字符串的长度
六、字符串切割
strtok(待切割的字符串地址,切割依据) ; //分割字符串
七、字符串拼接
strcat(字符串地址1,字符串地址2) ; //拼接两个字符串
sprintf(目标地址,”%s:%d”,name , age) ; //格式化拼接
八、内存清空
memset(内存空间地址,填入的值,内存空间大小) ; //将一段内存空间填入某值
bzero(内存空间地址,填入的值) ; //将一段内存空间清零

[温馨提示] 本文篇幅较长,可以使用目录进行检索。

引言

字符串函数(String processing function)也叫字符串处理函数,指的是编程语言中用来进行字符串处理的函数,需要调用头文件include。在C/C++编程中经常会遇到字符串的处理,比如路径的切割、信号的判断(字符串比较),以及字符串大小的计算,熟练掌握常用的字符串函数,了解其可以实现的功能,对于做项目大有裨益。

字符串函数种类繁多,本文精心整理几类常用的字符串函数。

字符串概述

1.字符串函数头文件:include ;
2.字符串定义:由双引号“”包围起来的数据,比如”sdasdsd”(单引号围起来的表示字符);
3. 字符串所在的内存空间:常量区(字符串常量);
4. 字符串的存储形式,是以字符数组的形式存在的 。

一、字符串拷贝函数strcpy&strncpy

1. strcpy:拷贝地址的字符串

【函数定义】 char * strcpy(char *dest, const char *src) ;
【参数说明】strcpy( 地址1(目标地址)地址2(要拷贝的地址)) ;
【功能】将 地址2的数据拷贝到 地址1
【返回值】地址1 ;
【注意】如果 地址2的数据大于 地址1的空间,则会造成缓冲溢出的错误情况。

代码验证:

2. strncpy:拷贝地址的前n个字符串

【函数定义】char * strncpy(char *dest, const char *src, size_t n) ;
【参数说明】strncpy( 地址1(目标地址)地址2(要拷贝的地址),拷贝前n个字节) ;
【功能】将 地址2的前n个字节拷贝到 地址1
【返回值】地址1。

代码验证:

二、内存拷贝函数memcpy&memccpy

1. memcpy:拷贝地址前n个字节的内存

【函数定义】 void * memcpy (void * dest, const void *src, size_t n) ;
【参数说明】memcpy( 地址1(目标地址)地址2(要拷贝的地址),拷贝前n个字节) ;
【功能】将 地址2的前n个字节拷贝到 地址1与 strncpy()不同的是, memcpy()会完整的复制 n 个字节, 不会因为遇到字符串结束’\0’而结束
【返回值】地址1 ;
【与strcpy 的区别】
strcpy从名字上看它操作的只能是字符串类型的数据,结束条件为遇到结束符;
memcpy 则是对内存进行拷贝,可以拷贝任何类型的数据。结束条件为用户设置的大小。

2. memccpy:拷贝地址前n个字节的内存,返回标志位下一个字节的地址

【函数定义】 void * memccpy(void *dest, const void * src, int c, size_t n) ;
【参数说明】memccpy( 地址1(目标地址)地址2(要拷贝的地址)标志,拷贝前n个字节) ;
【功能】将 地址2的前n个字节拷贝到 地址1,与 memcpy()不同的是, memccpy()会在复制时检查参数 c(标志) 是否出现, 若出现,则返回 dest 中值为 c (标志)的下一个字节地址 ;
【返回值】返回指向 dest 中值为 c(标志)的下一个字节指针(地址);返回值为 0 ,表示在 地址2所指内存前 n 个字节中没有值为 c(标志)的字节。

三、字符串比较函数strcmp&strchr&strstr

1. strcmp:比较字符串的大小

【函数定义】 int strcmp(const char *s1, const char *s2) ;
【参数说明】strcmp( 字符串1地址字符串2地址) ;
【功能】strcmp()用来比较参数 s1 和 s2 字符串(比较两个字符串是否相同)。字符串大小的比较是以 ASCII 码表上的顺序来决定, 此顺序亦为字符的值。strcmp()首先将 s1 第一个字符值减去 s2 第一个字符值, 若差值为 0 则再继续比较下个字符, 若差值不为 0 则将差值返回. 例如字符串”Ac”和”ba”比较则会返回字符”A”(65)和’b'(98)的差值(-33) ;
【返回值】若参数 s1 和 s2 字符串相同则返回 0;s1 若大于 s2 则返回大于 0 的值;s1 若小于 s2 则返回小于 0 的值。

代码验证:

2. strchr: 在一个字符串中查找指定的字符

【函数定义】 char * strchr (const char *s, int c) ;
【参数说明】strchr( 字符串地址指定的字符) ;
【功能】用来找出参数 s 字符串中第一个出现的参数 c 地址, 然后将该字符出现的地址返回。
【返回值】如果找到指定的字符则返回该字符所在地址, 否则返回 0。

代码验证:

3. strstr:在一个字符串中查找指定的字符串

【函数定义】char * strstr(const char *haystack, const char * needle) ;
【参数说明】strstr( 字符串1地址字符串2地址) ;
【功能】从字符串1中搜寻字符串2, 并将第一次出现的地址返回 ;
【返回值】搜寻成功,返回指定字符串第一次出现的地址;搜寻失败 ,返回 0。

代码验证:

四、内存比较函数memcmp

1. memcmp:比较内存前n个字符

【函数定义】int memcmp (const void *s1, const void *s2, size_t n) ;
【参数说明】memcmp( 字符串1地址字符串2地址,前n个字符) ;
【功能】memcmp()用来比较 s1 和 s2 所指的内存区间前 n 个字符。字符串大小的比较是以 ASCII 码表上的顺序来决定, 次顺序亦为字符的值。 memcmp()首先将 s1 第一个字符值减去 s2 第一个字符的值, 若差为 0 则再继续比较下个字符, 若差值不为 0 则将差值返回。例如, 字符串”Ac”和”ba”比较则会返回字符’A'(65)和’b'(98)的差值(-33)。
【返回值】若参数 s1 和 s2 所指的内存内容都完全相同则返回 0 值; s1 若大于 s2 则返回大于 0 的值;s1 若小于s2 则返回小于 0 的值。

代码验证:

五、字符串长度函数strlen

1. strlen:计算字符串的长度

【函数定义】 size_t strlen (const char *s) ;
【参数说明】strlen( 字符串地址) ;
【功能】用来计算指定的字符串 s 的长度, 不包括结束字符”\0″
【返回值】返回字符串的字符个数。

代码验证:

可以看出,一个英文或英文标点符号均表示一个字符,而一个汉字或中文标点符号均表示3个字符。

六、字符串切割和拼接函数strtok&strcat&sprintf

1. strtok:分割字符串

【函数定义】 char * strtok(char *s, const char *delim) ;
【参数说明】strtok( 待切割的字符串地址切割依据) ;
【功能】用来将字符串分割成一个个片段。参数 s 指向欲分割的字符串, 参数 delim 则为分割字符串, 当 strtok()在参数 s 的字符串中发现到参数 delim 的分割字符时则会将该字符改为\0 字符。在第一次调用时, strtok()必需给予参数 s 字符串, 往后的调用则将参数 s 设置成 NULL。每次调用成功则返回下一个分割后的字符串指针。
【返回值】返回下一个分割后的字符串指针(地址), 如果已无从分割则返回 NULL。

代码验证:

注意:切割依据dlime 虽然是一个字符串,但是在使用的时候是按该字符串中的每一个字符进行分割的, 比如dlime 为“a-3″ 那么需要分割的字符串这个只要出现了 a 或 – 或 3 都会被认为是一个分割的字符。

2. strcat:拼接两个字符串

【函数定义】 char * strcat(char *dest, const char *src) ;
【参数说明】strcat( 字符串地址1字符串地址2) ;
【功能】会将 字符串地址2所指的字符串拷贝到 字符串地址1所指的字符串尾。 字符串地址1要有足够的空间来容纳要拷贝的字符串 ;
【返回值】 返回 字符串地址1

代码验证:

3. sprintf:格式化拼接

【头文件】#include
【函数定义】 int sprintf(char *str, const char * format, …) ;
【参数说明】sprintf(目标地址,”%s:%d”,name , age) ;
【功能】会根据参数 format 字符串来转换并格式化数据, 然后将结果复制到参数 str 所指的字符串
数组, 直到出现字符串结束(‘\0’)为止。
【返回值】成功则返回参数 str 字符串长度;失败则返回-1。

代码验证:

七、内存清空函数bzero&memset

1. memset:将一段内存空间填入某值

【函数定义】 void * memset(void *s, int c, size_t n) ;
【参数说明】memset(内存空间地址,填入的值,内存空间大小) ;
【功能】会将参数 s 所指的内存区域前 n 个字节以参数 c 填入, 然后返回指向 s 的指针。 在编写程序
时, 若需要将某一数组作初始化, memset()会相当方便,比如memset(buf , 0 , sizeof(buf))(将数组buf清零)。
【返回值】指向 s 的指针。

2. bzero:将一段内存空间清零

【函数定义】void bzero(void *s, int n) ;
【参数说明】bezro(内存空间地址,填入的值) ;
【功能】会将参数 s 所指的内存区域前 n 个字节, 全部设为零值。如bero(buf , 0),相当于memset(buf , 0 , sizeof(buf))。


参考资料

[1] linux_C函数库中文手册,PennyHot.