来到重点介绍的章节了,String Manipulation。这个分类下的各函数都是处理以null-terminal结尾的字符串。来看看需要介绍的函数表
strcoll | 按照指定locale设置比较两个字符串 |
_strdec | 比较两字符串,返回指定字符串地址 |
strcat | 把字符串加另一字符串 |
strchr | 在字符串中寻找指定字符 |
strcmp | 比较两字符串 |
strcspn | 在字符串s1中寻找s2中所出现的字符,返回s2中出现的第一个字符在s1中出现的位置(有点拗口) |
_strdup | 复制字符串,即clone |
_stricmp | 比较字符串,忽略大小写 |
strlen | 获取字符串长度 |
_strlwr | 把字符串转换为小写 |
strncat | 是strcat的加强版,增加了缓冲区控制 |
strpbrk | 在s1中寻找s2中任何一个字符相匹配的第一个字符的位置,空字符NULL不包括在内 |
_strrev | 翻转字符串 |
_strset | 设置字符串中某一位置的字符为指定字符 |
strstr | 在字符串s1中寻找字符串s2 |
strtok | 在字符串中找分隔符 |
strcoll、strcmp
C 语言从 C94 引入多语言支持以后处理中文方便多了,增加了 strcoll 这个根据 locale 比较字符串的函数。
简单地说,一个 locale 就是一组处理跟语言相关问题的规则,这里有一篇简介。这些规则就包括如何对字符串进行比较和排序。按照 C94 及 C99 标准的规定,程序在启动时设置 locale 为 "C"。在 "C" locale 下,字符串的比较就是按照内码一个字节一个字节地进行,这时 strcoll 与 strcmp 函数没有区别。在其他 locale 下,字符串的比较方式则不同了,例如在简体中文 locale 下,strcmp 仍然按内码比较,而 strcoll 对于汉字则是按拼音进行的(这也跟操作系统有关,Windows 还支持按笔划排序,可以在“区域和语言设置”里面修改)。
1.实现
strcoll就简单处理,采取本地locale,也就是实现同strcmp相同,就是按照字节进行比较的。
1: /****
2: strcmp - compare two strings, returning less than, equal to, or greater than
3:
4: Purpose:
5: Compares two string, determining their lexical order. Unsigned
6: comparison is used.
7:
8: Entry:
9: const char * src - string for left-hand side of comparison
10: const char * dst - string for right-hand side of comparison
11:
12: Exit:
13: AX < 0, 0, or >0, indicating whether the first string is
14: Less than, Equal to, or Greater than the second string.
15:
16: Uses:
17: CX, DX
18:
19: Exceptions:
20: ***/
21: template<typename T>
22: inline int tStrCmp(const T *pStr1, const T *pStr2)
23: {
24: while( *pStr1 == *pStr2++ )
25: if( *pStr1++ == 0 )
26: return (0);
27:
28: return (*pStr1 - *--pStr2);
29: }
30:
31: /*
32: 比较两字符串的大小,假设本地环境为ASCII
33: */
34: template<typename T>
35: inline int tStrColl(const T *pStr1, const T *pStr2)
36: {
37: return tStrCmp(pStr1, pStr2);
38: }
稍微注意下那个while循环,因为要判断pStr1是否已经遇到结束符,所以提前做了累加然后判断,导致return的时候pStr2要先累减后再比较。
2.测试
1: char p1[] = "chenyu";
2: char p2[] = "chenyy";
3:
4: int nVal = ::strcoll(p1, p2);
5: cout << nVal << endl;
6:
7: nVal = CY_CRT::tStrColl(p1, p2);
8: cout << nVal << endl;
结果很明显~