//Str_ReplaceA:字符串替换(窄字节),在源字符串中直接操作;
//pstrString:指向要执行替换的源字符串[输入][输出],内容不可以为空;
//ulMaximumimum:声明pstrString指向的内存可以容纳的最大字节量(含空中止);
//pstrSearch:指向需要被替换掉的字符串内容,内容不可以为空;
//pstrReplace:指向用于替换的新字符串内容,内容可以为空.
bool Str_ReplaceA (char * pstrString, unsigned long ulMaximumimum, const char * pstrSearch, const char * pstrReplace)
{
unsigned long ulLenOfString = 0, ulLenOfSearch = 0, ulLenOfReplace = 0;
unsigned long ulLenOfAbs = 0;
unsigned long ulPos = 0;
unsigned long i = 0;
//计算源字符串长度(不允许为空)
if (NULL == pstrString) return false;
while (0 != pstrString[ulLenOfString])
{
ulLenOfString++;
}
if (0 == ulLenOfString) return false;
//计算搜索字符串长度(不允许为空)
if (NULL == pstrSearch) return false;
while (0 != pstrSearch[ulLenOfSearch])
{
ulLenOfSearch++;
}
if (0 == ulLenOfSearch) return false;
//计算替换字符串长度(允许替换成空)
if (NULL != pstrReplace)
{
while (0 != pstrReplace[ulLenOfReplace])
{
ulLenOfReplace++;
}
}
//循环查找搜索字符串,并替换成新字符串
for (ulPos = 0; ulPos < ulLenOfString && ulLenOfString < ulMaximumimum; ulPos++)
{
for (i = 0; i < ulLenOfSearch; i++)
{
//判断源字符串是否已经到达结尾处
if (0 == pstrString[ulPos + i]) break;
//判断源字符串当前字符是否与搜索字符串当前字符相等
if (pstrString[ulPos + i] != pstrSearch[i]) break;
}
//搜索进度对应的是搜索字符串是否匹配.
if (i != ulLenOfSearch) continue;
//找到了搜索字符串,进行替换操作
//-----判断后续字符串是左移还是右移
if (ulLenOfReplace <= ulLenOfSearch)
{//替换字符串长度小于(等于)搜索字符串长度,源字符串的后续内容需要左移(从左向右的顺序进行复制)
//先复制替换字符串
for (i = 0; i < ulLenOfReplace; i++)
{
pstrString[ulPos++] = pstrReplace[i];
//直接操作ulPos可以使最上层while()循环跳过新替换的字符串部分,避免A替换成AA时的循环操作.
}
//向左移动后续部分(计算新长度)
ulLenOfAbs = ulLenOfSearch - ulLenOfReplace;
ulLenOfString = ulLenOfString - ulLenOfAbs;
for (i = ulPos; i <= ulLenOfString; i++)
{//i<=ulLenOfString使得最后一个空中止也会被复制,即正确的截断了字符串.
pstrString[i] = pstrString[i + ulLenOfAbs];
}
}else
{//替换字符串长度大于搜索字符串长度,源字符串的后续内容需要右移(从右向左的顺序进行复制,避免内存重叠问题)
//向右移动后续部分(计算新长度)
ulLenOfAbs = ulLenOfReplace - ulLenOfSearch;
ulLenOfString = ulLenOfString + ulLenOfAbs;
for (i = ulLenOfString; i > ulPos; i--)
{//i<=ulLenOfString使得最后一个空中止也会被复制,即正确的截断了字符串.
pstrString[i] = pstrString[i - ulLenOfAbs];
}
//复制替换字符串
for (i = 0; i < ulLenOfReplace; i++)
{
pstrString[ulPos++] = pstrReplace[i];
//直接操作ulPos可以使最上层while()循环跳过新替换的字符串部分,避免A替换成AA时的循环操作.
}
}
}
if (ulLenOfString == ulMaximumimum) return false;
return true;
}
函数特征是直接在源字符串中进行操作,不需要额外的存储空间,但前提是源字符串所在的内存区域有足够的空间容纳替换后的完整字符串,空间不足会导致源字符串被损坏.
宽字节版本的函数只需要替换函数声明即可,函数主体代码不需要修改.
bool Str_ReplaceW (wchar_t * pstrString, unsigned long ulMaximumimum, const wchar_t * pstrSearch, const wchar_t * pstrReplace)