《C和指针》读书笔记(8)

声明:该读书笔记摘抄自《C和指针》——Kenneth A.Reek (著)    徐波(译)。为了克服自己走马观花,提高阅读和学习效率,决定将自己在读书过程中遇到的一些知识点加以摘抄和总结备忘,在此感谢原书作者和翻译。

一、字符串长度

1、标准库函数:size_t     strlen(char  const   *string) ;   头文件:string.h, size_t 定义在stddef.h中,是无符号整型。

  2、字符串长度的比较:

方案一: if (strlen(x)  >=  strlen(y)) {

                          ..................

                 } 

方案二:if (strlen(x) - strlen(y)  >= 0) {

                       .....................

               }

方案一是正确的。方案二会出现问题,它的条件永远为真,因为strlen的返回值是无符号的,两个无符号的整型相减,结果还是无符号的。如果判断表达式中既有无符号也有有符号的,例如下面两个方案:

方案一:if (strlen(x)  >=  10) {

                   .......................

              }

方案二:if (strlen(x)  -   10   >=  0) {

                            ..............................

               }

同样,方案一是正确的。方案二会出现一些问题,在方案二中,将strlen的返回值强制转换为int再参与表达式运算可以消除这个问题。

二、字符串复制、连接、比较库函数

1、长度不受限的字符串函数  strcpy、strcat、strcmp,注意strcpy(char *dst, char const *src)和strcat(char *dst, char const *src), 当dst和src指向的内存区域出现重叠时,其结果是未定义的,因此,要保证dst指向的内存区域可以存储的下结果。

2、长度受限的字符串库函数 strncpy(char *dst,char const *src, size_t  len), strncat(char *dst, char const *src, size_t  len),   strncmp(char *dst, char const *src, size_t len)

三、字符串查找函数

1、查找一个字符

strchr(char const *src, int   ch);查找字符ch 在src中第一次出现的位置,若无,返回NULL

strrchr(char const *src, int ch);查找字符ch 在src中最后一次出现的位置,若无,返回NULL

2、查找字符集中的任一字符并返回其第一次出现的位置,strpbrk(char const *src, char const *group),若无,返回NULL。

3、查找子串str在src中第一次完整出现的位置,strstr(char const *src, char const *str),  若无,返回NULL;若str为空字符串,返回src。

注:在标准库中并没有strrpbrk和strrstr,如有需要自己实现,可以在函数内部调用strpbrk和strstr实现。

四、高级字符串查找

1、size_t   strspn(char const  *str, char  const   *group);   返回str起始部分匹配group中任意字符的字符个数,如果str中的某一个字符没有出现在group中,查找结束。该函数可用于查找str字符串中第一个非group中的字符的位置,str + 返回值即可求出。

  size_t   strcspn(char const  *str, char  const   *group);  返回str起始部分不匹配group中任意字符的字符个数,直到匹配到任意一个group中指定的字符结束。该函数可用于查找str字符串中所有的非group中的字符。

2、分隔字符串:char   *strtok(char  *str, char  const   *sep);  其中,sep指向一个字符串,它可以是很多分隔符的集合。注意一点:该函数会修改原字符串str。

五、char  *strerror(int  error_num);将一个错误码转换为字符串信息。

六、内存操作函数,可以处理任意字节序列,不仅仅限于以NULL结尾的字符串

memcpy、memmove、memcmp、memchr(注:该函数可以在一个字节序列中查找一个特定的值)、memset

1、这些函数的原型都指定了需要操作的字节数,注意,是字节数,如果是多字节数据,则要乘以数据长度。

2、在使用memcpy时,源地址如果与目的地址重叠,则结果为定义;

     memmove相比memcpy可以正确处理源地址如果与目的地址重叠的情况,因为memmove的实现利用了临时位置,这个临时位置可以保证源与目的地址不重叠,但是它的速度可能会比memcpy慢一些。


以上为第九章“字符串、字符和字节”摘抄总结,未完待续。。。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值