您的位置:首页 > 其它

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

2013-07-16 00:11 120 查看
声明:该读书笔记摘抄自《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慢一些。

以上为第九章“字符串、字符和字节”摘抄总结,未完待续。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: