有关字符串的那些库函数

简介: 有关字符串的那些库函数

大家好,很久没有发文章了,首先祝读者们新年快乐哈!

今天主要讲一讲C语言中有关字符串的那些库函数。大家知道,“串”在C语言中是一个比较特殊的存在,因为C语言中没有这样一种类型,只是将一个一个的字符存放在了数组里,便得到了我们所说的字符串。

然而字符串的使用却非常的广泛,因此掌握一些常用的字符串操作函数非常的重要,下面就讲一讲那些最常用到的有关字符串的库函数:strlen, strcat, strncat, strcpy, strncpy, strcmp, strncmp, strstr, strtok, strerror. 以及四个内存操作函数:memset, memcpy, memmove, memcmp.(注:以上库函数均在头文件<string.h>中)

1.strlen

strlen用于计算一个字符串的长度,及字符串中所含字符的个数,其函数原型为:size_t strlen(const char* str);函数参数是指向字符串的指针,返回类型为无符号整型。需要注意的是,strlen只关注字符串中有没有\0,也就是说,它只计算\0以前的字符的个数,且不包含\0,这一点和关键字sizeof要区分开,sizeof是计算变量所占空间大小,单位是字节。

2.strcat与strncat

strcat是在一个字符串后追加另一个字符串的内容,其函数原型为:char* (char* destination, const char* source); 从参数名称即可看出第一个参数为指向目的地字符串的指针,第二个为指向源头字符串的指针,该函数将source指针所指的字符串中的内容追加到destination指针所指向的字符串的后面。不难想到,该函数会先找到destination指针所指向的字符串的结束标志,即\0,然后从此处开始追加source指针所指向的字符串的内容,直到其出现\0为止,且该\0也会被追加到destination所指向的字符串中。

通过以上分析,可以总结出要注意的几点事项:

1.destination指针指向的空间必须足够大,可以装下追加后的内容,否则会出现内存使用错误。

2.source指针指向的字符串必须以\0结束,这样追加后destination指针指向的字符串才有结束标志。

至于strncat,其用法与strcat十分相似,其函数原型为:char* (char*  destination, const  char*  source,  size_t  num); 比strcat多了一个num,即只在destination指向的字符串后追加num个字节的内容。(后strncmp,strncpy与此类似。)

这时就涉及到num与source指针指向的字符串所占空间大小的关系问题:(1)num小于source指针指向的字符串所占空间时,会在追加完后主动补一个\0; (2) num大于等于source指针指向的字符串所占空间时,该函数将source指针指向的字符串追加到destination指针指向的字符串后就结束了。(要保证source指针指向的字符串有\0作为结束标志)也就是说不会补很多\0

强调一点:字符串自己给自己追加时只能用strncat,用num控制追加字节数,因为自己给自己追加时会改变其字符串本身,将\0给覆盖掉了,这时source指针指向的字符串也没有最后的\0,使用strcat会造成错误!

3.strcpy与strncpy

strcpy函数原型为:char*  (char* destination, const char* source);  作用是将source指针指向的字符串拷贝到destination指针指向的字符串中。注意事项:(1)destination指针指向的字符串所占空间必须足够大,可以装下source指针指向的字符串。(2)source指针指向的字符串必须要以\0作为结束标志。

类似的,strncpy将source指针指向的字符串中的前num个字节的内容拷贝到destination指针指向的字符串中,注意当num大于source指针指向的字符串所占空间时会补\0,补够num个字节。而当num小于source指针指向的字符串所占空间时不会补\0。

4.strcmp与strncmp

strcmp函数原型为:int strcmp(const  char*  str1,  const  char*  str2);该函数会比较两个字符串的“大小”,这里的“大小”是逐个比较两个字符串中每个字符的ASCII值,当两个字符ASCII值相等时比较下一个字符,直到两个字符的ASCII值不等或者都遇到了\0。注意该函数的返回类型为int,(上面介绍的库函数返回类型均为char*,方便进行链式访问)表示:

(1)当str1指向的字符串“大于”str2指向的字符串时,返回大于0的整型。

(2)当str1指向的字符串“小于”str2指向的字符串时,返回小于0的整型。

(1)当str1指向的字符串“等于”str2指向的字符串时,返回0。

与前面一样,strncmp只是多了一个参数num,表示时只比较两个字符串的前num个字节。

5.strstr

strstr函数原型为:char*  strstr (const  char* str1,const  char*  str2); 该函数会在str1所指向的字符串中查找str2所指向的字符串(即查找子串),若str1指向的字符串中包含str2指向的字符串,函数会返回str1指向的字符串中第一次出现str2指向的字符串的首字符的地址,即char* 的指针。

有点乱,举个例子:若str1指向的字符串为"abcdefbcde",str2指向的字符串为"bcde",因为"abcdefbcde"中包含"bcde",所以该函数会返回一个char* 的指针,指向"abcdefbcde"中第一个‘b’。

至于该函数的具体实现,有一个叫做KMP模式匹配法的算法,有兴趣的同学可以自己在网上搜一搜,这里就不做讲解了。

6.strtok

strtok函数原型为char*  strtok (char* str,  const  char*  delimiters); 其第二个参数为一个char* 的指针,指向的内容为类似于‘,’    ‘:’等的分隔符,str为指向字符串的指针,其内容可能有第二个参数指向的字符。

该函数的作用是按分隔符的内容为标志,在str指向的字符串中寻找分隔符,并将其置为\0,有分割字符串的意思,返回一个char*的指针,指向被分割出来的子字符串(因为已经将分隔符置为\0,返回该\0之前的那个子字符串的首元素地址没有问题)。

注意事项:

(1)strtok函数会改变被操作的字符串,所以使用时通常将一份临时拷贝的字符串传给该函数,并且该拷贝的字符串是可修改的。

(2)当调用该函数第一个实参不为NULL时,该函数会从str指向的字符串中第一个字符开始找分隔符,找到第一个分割符将其置为\0并记住(保存)该位置。

(3)当调用该函数的第一个参数为NULL时(此时通常前面调用过该函数且第一个实参不为NULL),该函数会从之前那个字符串中保存的位置开始寻找分隔符,将其置为\0并记住(保存)该位置。

(4)当字符串中不存在分隔符,则返回NULL。(第一次调用strtok时若字符串中不存在分隔符,则返回指向该字符串的指针)

7.strerror

strerror函数原型为char* strerror(int  errnum);参数errnum为错误码,通常用errno这个全局变量。先讲一讲错误码,在C中有很多的错误信息并为他们设置了错误码(int型)。当库函数使用时,若发生错误(类似与内存开辟失败等等)会把errno这个全局的错误变量设置为本次执行库函数产生的错误码,而strerror可以将错误码翻译成错误信息。

注意:errno是C语言提供的全局变量,可以直接使用,在头文件<errno.h>中。

以上是常用的关于字符串操作的库函数,下面介绍四个内存操作函数。顾名思义,这几个函数可以操作任意类型的数据,而不仅仅局限于字符串。注意:这四个库函数也包含在头文件<string.h>中,且这些内存操作函数是以字节为单位操作数据的(所以这类函数都有一个size_t   num的参数,用于控制操作的字节数)。

8.memcpy

memcpy的函数原型为:void*  memcpy(void*  destination, const  void*  source,  size_t  num); 由于可以操作任意类型的数据,所以该函数返回类型、形参都是void*的指针(下同)。该函数的作用是将source指向的内容拷贝到destination指向的空间,且只拷贝num个字节。注意事项:

(1)该函数拷贝且只拷贝num个字节,遇不遇到\0与拷贝是否停止没有关系。

(2)在C语言语法规定中,该函数只能用于拷贝内存块不重叠的数据,若用于拷贝内存块重叠的部分,则会导致未定义的行为。(这只是C语言的语法规定,经过这些年的发展,有些编译器为了方便,即使内存块有重叠也能成功拷贝,如VS编译器)

9.memmove

memmove的函数原型为:void*  memmove(void*  destination, const  void*  source,  size_t  num); 与memcpy一模一样,功能也基本一样,唯一的不同就是该函数可以处理内存块重叠的拷贝,比memcpy的功能更强大一些。

10.memcmp

memcmp的函数原型为:int  memcmp(const  void*  ptr1,  const  void*  ptr2,  size_t  num); 该函数功能与strcmp基本一样, 逐字节比较ptr1指向的内容和ptr2指向的内容:

(1)当ptr1指向的内容“大于”ptr2指向的字符串时,返回大于0的整型。

(2)当ptr1指向的内容“小于”ptr2指向的字符串时,返回小于0的整型。

(1)当ptr1指向的内容“等于”ptr2指向的字符串时,返回0。

注意只比较前num个字节。

11.memset

memset的函数原型为:void *  memset(void *  ptr, int  value,  size_t  num);  该函数的作用是将ptr指针指向的内存块逐字节设置为数据value,设置且只设置num个字节。由于是逐字节设置,所以value通常为0或-1, 0的补码为0000 0000(十六进制),-1的补码为ffff ffff(十六进制),可以真正的将ptr指向内容的前num个字节设置为全0或-1。

好了,以上就是这篇文章的所有内容了,水平有限,如有任何不足、错误之处,还请广大朋友评论指针,不胜感激。当然,如果您觉得本文对您有帮助,不妨点个赞,关注我,谢谢大家!

相关文章
|
存储 算法
探索字符与字符串:基本库函数的使用(二)
探索字符与字符串:基本库函数的使用(二)
37 0
|
1月前
|
C语言
C语言字符(串)函数
C语言字符(串)函数
|
6月前
|
程序员 C语言 开发者
C语言库函数 — 字符串函数(含模拟实现字符串函数)
C语言库函数 — 字符串函数(含模拟实现字符串函数)
61 0
|
6月前
|
安全 Unix Linux
【C/C++ 字符串】探索C语言之字符串分割函数:strtok和strsep的区别
【C/C++ 字符串】探索C语言之字符串分割函数:strtok和strsep的区别
124 0
|
C语言 C++
C语言/关于字符和字符串的库函数
C语言/关于字符和字符串的库函数
|
6月前
|
C语言
C语言字符串与字符串函数
C语言字符串与字符串函数
36 0
|
编译器
探索字符与字符串:基本库函数的使用(一)
探索字符与字符串:基本库函数的使用(一)
39 0
|
存储 安全 C语言
【C语言】字符函数和字符串函数(一)—>库函数的介绍与模拟实现(上)
【C语言】字符函数和字符串函数(一)—>库函数的介绍与模拟实现(上)
93 0
|
C语言
【C语言】字符函数和字符串函数(一)—>库函数的介绍与模拟实现(下)
【C语言】字符函数和字符串函数(一)—>库函数的介绍与模拟实现(下)
71 0
|
C语言
库函数之字符函数与字符串函数(下)
库函数之字符函数与字符串函数(下)
60 0