我们最熟悉的字符串比较函数莫过于strcmp了,但这个函数仅仅是根据字符进行比较,没有考虑字符串的逻辑意义,为此微软为我们提供了一个StrCmpLogicalW函数,它比较数字时不将其视为文本而是视为数值。
我们可以从下列这个简单的字符串数组排序的结果看出这两个函数的区别:
使用StrCmpLogicalW进行比较的结果:
2string
3string
20string
st2ring
st3ring
st20ring
string2
string3
string20
使用简单的strcmp函数进行比较的结果:
20string
2string
3string
st20ring
st2ring
st3ring
string2
string20
string3
下面这段代码就是模仿这个函数的实现:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->
#include<iostream>
#include<afx.h>
#include"deelx.h"
usingnamespacestd;
#defineMATCH_NUMBERS"[+-]?//d+(//.//d+)?"
intCompare(CStringcsText1,CStringcsText2)
{
staticCRegexpreg(MATCH_NUMBERS);
intnEnd1=0,nEnd2=0;
while(1)
{
MatchResultret1=reg.Match(csText1,nEnd1);
MatchResultret2=reg.Match(csText2,nEnd2);
CStringconst&csSubText1=ret1.IsMatched()?csText1.Mid(nEnd1,ret1.GetStart()-nEnd1):csText1;
CStringconst&csSubText2=ret2.IsMatched()?csText2.Mid(nEnd2,ret2.GetStart()-nEnd2):csText2;
//子串不同,则返回
if(csSubText1!=csSubText2)
returncsSubText1>csSubText2?1:-1;
/**//*
既然两个字符串相等,而两个字符串又已经消耗完,那自然可以返回了.
*/
if(!ret1.IsMatched()&&!ret2.IsMatched())return0;
if(ret1.IsMatched()&&ret2.IsMatched())
{//字符串还未消耗完毕,继续按逻辑比较
/**//*
GetGroupStart()返回正则表达式中"(//.//d+)"这一个组的起始位置.如果没有匹配,则返回-1;(可查看deelx的说明文档)
这个组是否匹配意味着捕获的数字是否带有小数点以及小数部分.
如果捕获的两个数字有一个带有小数部分.则按浮点数处理.否则按整数处理
*/
if(ret1.GetGroupStart(1)>=0||ret2.GetGroupStart(1)>=0)
{//带小数点,按浮点数比较数值大小
doubledNum1=_tcstod(csText1.Mid(ret1.GetStart(),ret1.GetEnd()-ret1.GetStart()),0);
doubledNum2=_tcstod(csText2.Mid(ret2.GetStart(),ret2.GetEnd()-ret2.GetStart()),0);
if(dNum1!=dNum2)returndNum1>dNum2?1:-1;
}
else
{//按整数处理,比较两个数的数值大小
__int64nNum1=_ttoi64(csText1.Mid(ret1.GetStart(),ret1.GetEnd()-ret1.GetStart()));
__int64nNum2=_ttoi64(csText2.Mid(ret2.GetStart(),ret2.GetEnd()-ret2.GetStart()));
if(nNum1!=nNum2)returnnNum1>nNum2?1:-1;
}
nEnd1=ret1.GetEnd();
nEnd2=ret2.GetEnd();
}
else
{//现在两个里面肯定有且只有一个IsMatch()不为真
returnret1.IsMatched()?1:-1;
}
}
return0;
}
intmain()
{
CStringstr1("st3ring"),str2("st20ring");
intresult;
result=Compare(str1,str2);
std::cout<<"resultis:"<<result<<endl;
result=strcmp(str1.GetBuffer(10),str2.GetBuffer(10));
cout<<"resultis:"<<result<<endl;
system("pause");
return0;
}
代码中使用了一个开源的正则表达式引擎,DEELX 正则表达式引擎,
分享到:
相关推荐
字符串操作----- 字符串操作----- 字符串操作----- 字符串操作----- v 字符串操作----- 字符串操作----- 字符串操作-----
c语言字符串函数详解--函数名及源代码整理
多功能文本字符串转换函数[多功能文本字符串转换函数]-精品源代码
c语言函数描述,可以方便的使用字符串函数进行程序,同时在软件开发中可以方便字符串的处理,提高软件开发效率
c语言字符串函数详解--函数名及源代码整理.pdf
Linux下常用函数-字符串函数 Linux下常用函数-字符串函数 Linux下常用函数-字符串函数
SqlServer2000,用语数据库字符串相加的一个函数 用于字符串相加,字符串拼接
c语言字符串函数详解--函数名及源代码整理[借鉴].pdf
两个字符串处理函数[两个字符串处理函数]-精品源代码
一组字符串转换函数[一组字符串转换函数]-精品源代码
08.hive内置函数--时间-日期-字符串--函数.mp4
用一个函数实现两个字符串的比较,即自己写一个 strcmp 函数
常用字符串处理函数 求子字符串,字符串分割,编码转换.
自己编写的字符串分割函数-divide_str.m 由于MATLAB没有字符串分割函数,所以自己就编写了一个: divide_str.m 举几个例子: >> str='ab ab ab'; >> divide_str ans = 'ab' 'ab'...
字符串相似程度,字符串之间比较,站名对比
C#字符串函数大全-很有用的,里面包括C#程序中所需要的大多数字符串函数
python学习笔记,包含数组属性方法总结-数组与字符串的转换-生成数组的函数-矩阵
不需要关心接受的字符串编码是UTF_8还是GBK,还是ios-8859-1,自动转换为utf-8编码格式,无需判断字符串原有编码,用法://处理编码String newStr = GetEncode.transcode(oldStr);
Oracle 函数大全(字符串函数,数学函数,日期函数,逻辑运算函数,其他函数)
305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)...