《c和指针》笔记8

  标准库提供了一些用于处理字符串的函数,它们的原型位于头文件string.h中.

  strlen:用于计算字符串的长度,返回类型是一个无符号的整数,因此将它用于表达式的时候要特别注意,如下:

if( strlen(x) <= strlen(y) )//可以正常运行
   ...

if( 0 <= strlen(y) - strlen(x) )//该表达式永远为真,因为右边表达式的结果将会是一个无符号整数,而无符号数绝对不会为负
   ...

  所以如果要使用strlen作为表达式,则应该在有符号数的表达式中使用.

 

  strcpy:把一个字符串从一个位置复制到另外一个位置,要注意2点:

  • 需要复制的字符串和目标字符串内存不能重叠,否则结果会是未定义
  • 将一个较长的字符串复制到一个较短的数组中,将会导致溢出

  因此我们可以使用另外一个版本:strncpy.该函数指定了将多少个字符添加到目标字符数组中.

  但是该函数在如果源字符比指定长度更长时,结果字符串将不会以NUL字节结尾,这会导致在使用strlen时查找边界外的内存而导致程序崩溃.

  因此我们在使用该函数的时候,最好在其后手动添加一个NUL字节作为结尾.

 

  strcat:把一个字符串拷贝添加(拼接)到另一个字符串后面,如果原字符串与目标字符串内存重叠,结果将会是未定义.

  跟strcpy相似,如果长字符串添加到一个较短的数组中,也会导致溢出.

  另外一个版本是:strncat.该函数同strncpy一样指定了将多少字节添加到目标字符数组中,但是该函数会默认在结尾加上NUL字节.

 

  strcmp:比较2个字符串,如果前者小于后者则返回负数,前者等于后者返回0,前者大于后者返回大于零的值.要注意:标准并没有规定前者小于后者会返回-1,前者大于后者会返回1.

  在使用过程中也尽量不要将该函数的返回值当作布尔值进行测试,因此也不要将其返回值与1或者-1进行比较.

  对于另一个版本strncmp,则是指定了需要比较多少个字节.

 

  strchr、strrchr在目标字符串中查找一个特定的字符.前者返回的是该字符第一次出现的位置,而后者则是最后一次出现的位置,返回类型均为指针.

 

  strpbrk是查找任意几个字符,返回的是任意字符在目标字符数组中第一次出现的位置,返回值为指针.

 

  strstr是用于查找一个子串的.

 

  strspn、strcspn用于在字符串的起始位置对字符计数的.

 

  一个字符串常常包含几个单独部分,他们彼此被分隔开.要处理这些部分,我们可以使用strtok,该函数在执行任务的时候,会修改所处理的字符串.

  如果源字符串不能修改,则会复制一份并将这份复制的传给函数.因此函数连续几次调用,虽然参数是一样的,但是结果可能是不同的.

 

  以上都是关于字符的相关函数.如果想处理任何类型,也就是类似泛型版本的,我们可以使用:memcpy、memmove、memcmp、memchr、memset.

  前几个我们根据名字可以判断它们的用途.

  memchr函数在一个字节序列中查找一个特定的值.

  memset函数把一个序列字节初始化为一个特定的值.

  

  今天就到这里了,明天继续,加油.

posted @ 2012-06-27 07:13  ahl5esoft  阅读(223)  评论(0编辑  收藏  举报