代码作用输入一段字符串。。用新的字符 替换旧的字符。例如: str("hello the world")
oldpart("world")
newpart("china")执行完此函数 输出为 "hello the china" 这样替换正确
如果newpart字符长度大于oldpart的字符长度就会出问题。比如newpart("china!!!")程序就会非法退出了。找不到原因。恳请帮助。下面是此函数代码char* strReplace1(char* str, const char* oldpart, const char* newpart)
{
char temp[2048];
memset(temp, 0, 2048);
const int size = strlen(oldpart);
const int sizeNew = strlen(newpart);
int off = 0;
char* pch = strstr(str, oldpart);
int pos1=0, pos2=0;
while(pch!=NULL)
{
pos2=pch-str;
memmove(temp+off, str+pos1, pos2-pos1); strcat(temp, newpart);
off+=pos2-pos1+sizeNew;
pos1 = pos2+size;
pch = strstr(pch+size, oldpart);
}
pch=str;
strcat(temp,str+pos1);
strcpy(str, temp); return str;
}
oldpart("world")
newpart("china")执行完此函数 输出为 "hello the china" 这样替换正确
如果newpart字符长度大于oldpart的字符长度就会出问题。比如newpart("china!!!")程序就会非法退出了。找不到原因。恳请帮助。下面是此函数代码char* strReplace1(char* str, const char* oldpart, const char* newpart)
{
char temp[2048];
memset(temp, 0, 2048);
const int size = strlen(oldpart);
const int sizeNew = strlen(newpart);
int off = 0;
char* pch = strstr(str, oldpart);
int pos1=0, pos2=0;
while(pch!=NULL)
{
pos2=pch-str;
memmove(temp+off, str+pos1, pos2-pos1); strcat(temp, newpart);
off+=pos2-pos1+sizeNew;
pos1 = pos2+size;
pch = strstr(pch+size, oldpart);
}
pch=str;
strcat(temp,str+pos1);
strcpy(str, temp); return str;
}
解决方案 »
- 诡异的send函数,(如果服务端不开启,这个函数居然不堵塞,返回了)
- 请教:关于vc9中修改Icon的问题,4位8位图标可以在vs内直接修改,32位vs内不可以直接修改,咋办呢?
- WSAEventSelect模型
- 不明白返回值有何区别,大家来看看,谢谢
- onestation进来,感谢你给分了,斑竹不要删除,给分完事马上结贴
- 如何定义一个记录打开文本的字符的字符串链表!
- 讨论一下dialog base 的static release 的问题
- 为什么这段代码编译时候没有错,但是不能运行.关于线程的
- ticks,tickcount()????(50分送!!)
- VC开发OpenGL中的坐标转换问题
- 超菜鸟的问题,求解答了呵呵
- vc或者c++中编程将excel转成pdf格式的文件的方法
int Replace( TCHAR chOld, TCHAR chNew );int Replace( LPCTSTR lpszOld, LPCTSTR lpszNew );Return ValueThe number of replaced instances of the character. Zero if the string isn't changed.
str("hello the world dskfhsdh")
用Find函数找到world,返回的位置是10,然后定义一个CString s1
用left函数使s1="hello the "
同样用right得到s2="dskfhsdh"
然后result=s1+替换+s2
{
char *p = strstr(str, oldpart); *(p+1) = '\0';
strcat(str, newpart);
}找到位置,替换就OK了
//////////////////////////////////////////////////////////////////////////
/// 在指定字符串中替换指定字符串为指定字符串
//////////////////////////////////////////////////////////////////////////std::string ReplaceString(std::string strSrc,std::string strPos,std::string strStr)
{
std::string::iterator IterL;
std::string::size_type indexCh1a = 0;
std::string::size_type off = 0;
std::string result6a = strSrc;
if (strPos.empty())
{
return strSrc;
}
while((indexCh1a = strSrc.find (strPos,off)) != std::string::npos)
{
IterL = strSrc.begin ( ) + indexCh1a;
off = indexCh1a + strStr.size();
result6a = strSrc.replace ( IterL , IterL+strPos.size() , strStr );
}
return result6a;
}// 使用
// 记得包含头文件#include <string>
std::string strSrc = "hello the world";
std::string strPos = "world";
std::string strStr = "china";strSrc = ReplaceString(strSrc , strPos, strStr);// strSrc就是你要的.
pch和str都是char* 类型,无法支持"-"(减)操作。
在str中循环找oldpart,找到一个,获取其开头字符在str的位置pos1,和结尾字符的位置pos2,这样就把str截为三段,将第一段考给temp,再strcat一个newpart,再对第三段做前述处理(递归)
{
char temp[1024];
char *p = strstr(str, oldpart);
while( p != NULL )
{
memset(temp, '\0', sizeof(temp));
// 提取oldpart后面的字符串,装入temp中
strcpy(temp, p+sizeof(oldpart));
// oldpart前面的字符串替换
*(p + 1) = '\0';
strcpy(str, newpart);
// 合并成此次替换好的字符串
strcpy(str, temp);
// 寻找下一次的位置
p = strstr(str, oldpart);
}
}
strcat(temp,str+pos1);
return temp; //返回temp//strcpy(str, temp);
//return str;
{
const int size = strlen(oldpart);
const int sizeNew = strlen(newpart);
char* pch = strstr(str, oldpart);
int nNeedLen = strlen(newpart) - strlen(oldpart);
int pos2=0;
while(pch!=NULL)
{
pos2=pch-str;
int nMovlen = strlen(str) - pos2 + 1; memmove(pch + nNeedLen, pch, nMovlen); memcpy(str+pos2, newpart, sizeNew); pch = strstr(pch + sizeNew, oldpart);
} return str;
}测试通过。
{
const int size = strlen(oldpart); int pos1=0, pos2=0;
char *pch = strstr(str, oldpart);
pos1 = pch - str;
pos2 = pos1 + size;
char *temp = str + pos2; //±£´æµÚÈý¶ÎµÄµØÖ·
str[pos1] = 0; //½«str½ØΪµÚÒ»¶Î strcat(buffer, str);
strcat(buffer, newpart);
ASSERT(strlen(buffer) < 2048); str = temp;
if(strlen(str) > 0)
{
test(str, buffer, oldpart, newpart);
}
}
char temp[2048];
memset(temp, 0, 2048);
test(str, temp, "world", "china!!!");
strcpy(str, temp);
MessageBox(str);