代码作用输入一段字符串。。用新的字符 替换旧的字符。例如: 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;
}

解决方案 »

  1.   

    CString::Replace
    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.
      

  2.   

    楼上说的是CString的Replace函数吗?因为我里面还要做处理。所以不能用MFC自带的函数
      

  3.   

    你这个太复杂了,直接用CString ,例如
    str("hello the world dskfhsdh") 
    用Find函数找到world,返回的位置是10,然后定义一个CString s1
    用left函数使s1="hello the "
    同样用right得到s2="dskfhsdh"
    然后result=s1+替换+s2
      

  4.   

    写那么多,逻辑太乱,帮你改了改,没有做错误处理void strReplace1(char* str, const char* oldpart, const char* newpart) 

        char *p = strstr(str, oldpart);    *(p+1) = '\0';
        
        strcat(str, newpart);
    }找到位置,替换就OK了
      

  5.   

    如果是一大段的话。用CString就不好解决了。一大段话中有n个这样的字符。其他字符中也包含这样的字符。不考虑用CString。。请帮忙纠正这段代码的错。
      

  6.   


    //////////////////////////////////////////////////////////////////////////
    /// 在指定字符串中替换指定字符串为指定字符串
    //////////////////////////////////////////////////////////////////////////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就是你要的.
      

  7.   

    如果是world hello the world world world..你这段代码怎么用呢?不考虑那么多,如果是大段字符串的话。如何去替换
      

  8.   

    pos2=pch-str;
    pch和str都是char* 类型,无法支持"-"(减)操作。
      

  9.   

    算法好像有些不妥,容易出错,试试这个思路:
    在str中循环找oldpart,找到一个,获取其开头字符在str的位置pos1,和结尾字符的位置pos2,这样就把str截为三段,将第一段考给temp,再strcat一个newpart,再对第三段做前述处理(递归)
      

  10.   

    那也是一样的逻辑void strReplace(char *str, const char *oldpart, const char *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);
    }
    }
      

  11.   

    rendao0563 比如需要替换 “hello the world world  worldworld!”只替换单独的world 不替换连起来的worldworld。用你的代码怎么处理。麻烦了。如果可以解决立刻给分!
      

  12.   

    替换后str的长度容纳不了新的字符串了,直接返回temp试试
    strcat(temp,str+pos1);
    return temp;  //返回temp//strcpy(str, temp);
    //return str; 
      

  13.   

    char*  strReplace1(char* str, const char* oldpart, const char* newpart) 

    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; 
    }测试通过。
      

  14.   

    晕,来晚了,刚才忙,没来得及搞void CMy001Dlg::test(char *str, char *buffer, const char *oldpart, const char *newpart)
    {
    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);
    }
    }
      

  15.   

    test是递归函数,下面是调用代码:char str[2048] = "hello the world world world";
    char temp[2048]; 
    memset(temp, 0, 2048);
    test(str, temp, "world", "china!!!");
    strcpy(str, temp);
    MessageBox(str);