一天一个CRT函数 strcoll

来到重点介绍的章节了,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;

结果很明显~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值