怎样替换字符串中的某个字符?谢谢

时间:2022-12-02 15:59:29
怎样替换字符串中的某个字符?谢谢

比如:
    要替换字符串 "C;\windows\system" 中的 "\" 为 "\\"。

    这样原来的字符串长度就会增加!

    怎么办?谢谢!

19 个解决方案

#1


如果是用标准C++的话,你可以用泛型算法中的replace函数,它支持在string等容器中替换.

#2


//ReplaceString() 替换字符串的片段(此版本要搜索两次字符串,速度不快,但内存消耗最少)
//copyleft by xingweiwei(alex.xing@163.com, http://b7156.xici.net)
//1999-05-06

//sSrc - 待替换字符串
//sOld - 旧“片段”
//sNew - 新“片段”
//char * - 返回新字符串,记得用完后用 free() 释放
char * ReplaceString(const char * sSrc, const char * sOld, const char * sNew)
{
    //计算 sOld 与 sNew 长度差
    size_t nOldLen = strlen(sOld);
    size_t nNewLen = strlen(sNew);
    signed nDiff = (signed) (nNewLen) - (signed) (nOldLen);

    //搜索统计 pOldStr 中有多少个 sOld
    int nMatch = 0;
    for(char * p = sSrc;;)
    {
        p = strstr(p, sOld);    //搜索匹配片段Match
        if ( p != NULL )        //如果找到一个Match
        {
            nMatch++;           //计数
            p += nOldLen;       //搜索指针指向这个Match之后
        }
        else                    //如果再也找不到
        {
            break;              //搜索结束
        }
    }

    //计算目标字符串长度
    signed nDestLen = (signed) (strlen(sSrc)) + nMatch * nDiff;
    assert ( nDestLen >= 0 );

    //分配空间
    char * pDestMem = (char *) malloc(nDestLen+1);
    if ( pDestMem == NULL )
    {
        return NULL;
    }

    //分段拷贝
    char * pDest = pDestMem;
    char * pSrc = sSrc;
    for(;;)
    {
        char * pMatch = strstr(pSrc, sOld);     //搜索匹配片段Match
        if ( pMatch != NULL )
        {
            size_t nInterLen = pMatch - pSrc;   //相邻Match间的部分Inter的长度
            if ( nInterLen > 0 )
            {
                memcpy(pDest, pSrc, nInterLen); //拷贝Inter
                pDest += nInterLen;             //拷贝宿指针指向Inter之后
            }
            memcpy(pDest, sNew, nNewLen);       //拷贝sNew,为提高效率,此处不用 strcat()
            pDest += nNewLen;                   //拷贝宿指针指向sNew之后
            pSrc = pMatch + nOldLen;            //拷贝源指针指向sOld之后
        }
        else
        {
            break;
        }
    }
    strcpy(pDest, pSrc);       //拷贝最后一个Match后的一段,可能只是一个null-terminator,也可能是整个sSrc

    //返回结果
    return pDestMem;
}

#3


//ReplaceString() 替换字符串的片段(此版本要搜索两次字符串,速度不快,但内存消耗最少)
//copyleft by xingweiwei(alex.xing@163.com, http://b7156.xici.net)
//1999-05-06

//sSrc - 待替换字符串
//sOld - 旧“片段”
//sNew - 新“片段”
//char * - 返回新字符串,记得用完后用 free() 释放
char * ReplaceString(const char * sSrc, const char * sOld, const char * sNew)
{
    //计算 sOld 与 sNew 长度差
    size_t nOldLen = strlen(sOld);
    size_t nNewLen = strlen(sNew);
    signed nDiff = (signed) (nNewLen) - (signed) (nOldLen);

    //搜索统计 pOldStr 中有多少个 sOld
    int nMatch = 0;
    for(char * p = sSrc;;)
    {
        p = strstr(p, sOld);    //搜索匹配片段Match
        if ( p != NULL )        //如果找到一个Match
        {
            nMatch++;           //计数
            p += nOldLen;       //搜索指针指向这个Match之后
        }
        else                    //如果再也找不到
        {
            break;              //搜索结束
        }
    }

    //计算目标字符串长度
    signed nDestLen = (signed) (strlen(sSrc)) + nMatch * nDiff;
    assert ( nDestLen >= 0 );

    //分配空间
    char * pDestMem = (char *) malloc(nDestLen+1);
    if ( pDestMem == NULL )
    {
        return NULL;
    }

    //分段拷贝
    char * pDest = pDestMem;
    char * pSrc = sSrc;
    for(;;)
    {
        char * pMatch = strstr(pSrc, sOld);     //搜索匹配片段Match
        if ( pMatch != NULL )
        {
            size_t nInterLen = pMatch - pSrc;   //相邻Match间的部分Inter的长度
            if ( nInterLen > 0 )
            {
                memcpy(pDest, pSrc, nInterLen); //拷贝Inter
                pDest += nInterLen;             //拷贝宿指针指向Inter之后
            }
            memcpy(pDest, sNew, nNewLen);       //拷贝sNew,为提高效率,此处不用 strcat()
            pDest += nNewLen;                   //拷贝宿指针指向sNew之后
            pSrc = pMatch + nOldLen;            //拷贝源指针指向sOld之后
        }
        else
        {
            break;
        }
    }
    strcpy(pDest, pSrc);       //拷贝最后一个Match后的一段,可能只是一个null-terminator,也可能是整个sSrc

    //返回结果
    return pDestMem;
}

#4


这是C语言(C/C++编译器)的任意字符串的替换函数,该函数“扫描”了两遍字符串:第一遍统计匹配个数,以计算目标字符串长度,精确分配内存;第二遍扫描完成替换。如果只扫描一遍,要么分配一块固定的“足够”大的内存(如果你处理的都是“短”字符串,可以这么做),要么建立一个临时数据结构保存扫描信息,总之要多占内存。

#5


那!我来介绍用C++得general algorithm吧!

#include <algorithm>
#include <string>
#include <vector>

using namespace std;

char  oldchar="/";
char  newchar="//";
char  *a="C;\windows\system";

vector<string> vec(a,a+17);

replace(vec.begin(),vec.end(),oldchar,newchar); //这样newchar 就替换
                                                //oldchar了










#6


自已动手编写一个不也很有趣吗?

#7


C++ 中有 replace() 吗?

#8


C++ 中有 replace() 吗?

#9


CString::Replace

#10


kwok_1980(Mars):

char  oldchar="/";
char  newchar="//";

好象不对吧,再仔细检查一下

这个问题不是一个字符换成另一个字符那么简单:一个字符可能换成几个字符,长度变了。如果字符换字符,我一个循环替换就搞定了,用得着那么麻烦吗?
for (i = 0; i < n; i++)
  if (str[i] == oldchar)
    str[i] = newchar;

#11


to  kwok_1980(Mars) :

vector<string> vec(a,a+17); 什么意思,谢谢!!

#12


#include <vector> 报错

我用的是 TC++3

#13


没有人了吗???

#14


vector<string> vec(a,a+17); 就是初始化变量vec!vec[0],vec[1],vec[2]....vec[16],用起来跟一般的数组差不多
其实vector<string>就相当与一个char类型的数组,但,它是一个class vector
用起来比平时的char a[]灵活好用!它是动态的!

#15


>>>>C++ 中有 replace() 吗?

C++中当然有此函啦!#include <algorithm>
希望你在VC或DEV--C++中编译!

TC3.0不支持最新的C++ Standard

#16


C++标准模板库中的string对次支持的很好,你的TC3.0肯定支持不了的,可以
用VC6或者是BC5.5都能支持。

#include <string>
#include <iostream>
using namespace std;

int main()
{
    string str("your string");
    str.replace('\', "\\");

    cout << str << endl;
}

#17


主要是我的程序必须在 DOS 下运行,用 VC 可以吗?

#18


我的那个程序可以,DOS、UNIX都可以(必须用C++编译器)

#19


我来学习一下

#1


如果是用标准C++的话,你可以用泛型算法中的replace函数,它支持在string等容器中替换.

#2


//ReplaceString() 替换字符串的片段(此版本要搜索两次字符串,速度不快,但内存消耗最少)
//copyleft by xingweiwei(alex.xing@163.com, http://b7156.xici.net)
//1999-05-06

//sSrc - 待替换字符串
//sOld - 旧“片段”
//sNew - 新“片段”
//char * - 返回新字符串,记得用完后用 free() 释放
char * ReplaceString(const char * sSrc, const char * sOld, const char * sNew)
{
&nbsp;&nbsp;&nbsp;&nbsp;//计算 sOld 与 sNew 长度差
&nbsp;&nbsp;&nbsp;&nbsp;size_t nOldLen = strlen(sOld);
&nbsp;&nbsp;&nbsp;&nbsp;size_t nNewLen = strlen(sNew);
&nbsp;&nbsp;&nbsp;&nbsp;signed nDiff = (signed) (nNewLen) - (signed) (nOldLen);

&nbsp;&nbsp;&nbsp;&nbsp;//搜索统计 pOldStr 中有多少个 sOld
&nbsp;&nbsp;&nbsp;&nbsp;int nMatch = 0;
&nbsp;&nbsp;&nbsp;&nbsp;for(char * p = sSrc;;)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = strstr(p, sOld);&nbsp;&nbsp;&nbsp;&nbsp;//搜索匹配片段Match
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( p != NULL )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果找到一个Match
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nMatch++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   //计数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p += nOldLen;&nbsp;&nbsp;&nbsp;&nbsp;   //搜索指针指向这个Match之后
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果再也找不到
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //搜索结束
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;//计算目标字符串长度
&nbsp;&nbsp;&nbsp;&nbsp;signed nDestLen = (signed) (strlen(sSrc)) + nMatch * nDiff;
&nbsp;&nbsp;&nbsp;&nbsp;assert ( nDestLen >= 0 );

&nbsp;&nbsp;&nbsp;&nbsp;//分配空间
&nbsp;&nbsp;&nbsp;&nbsp;char * pDestMem = (char *) malloc(nDestLen+1);
&nbsp;&nbsp;&nbsp;&nbsp;if ( pDestMem == NULL )
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;//分段拷贝
&nbsp;&nbsp;&nbsp;&nbsp;char * pDest = pDestMem;
&nbsp;&nbsp;&nbsp;&nbsp;char * pSrc = sSrc;
&nbsp;&nbsp;&nbsp;&nbsp;for(;;)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char * pMatch = strstr(pSrc, sOld);&nbsp;&nbsp;&nbsp;&nbsp; //搜索匹配片段Match
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( pMatch != NULL )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t nInterLen = pMatch - pSrc;   //相邻Match间的部分Inter的长度
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( nInterLen > 0 )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(pDest, pSrc, nInterLen); //拷贝Inter
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDest += nInterLen;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //拷贝宿指针指向Inter之后
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(pDest, sNew, nNewLen);&nbsp;&nbsp;&nbsp;&nbsp;   //拷贝sNew,为提高效率,此处不用 strcat()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDest += nNewLen;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   //拷贝宿指针指向sNew之后
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pSrc = pMatch + nOldLen;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//拷贝源指针指向sOld之后
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;strcpy(pDest, pSrc);&nbsp;&nbsp;&nbsp;&nbsp;   //拷贝最后一个Match后的一段,可能只是一个null-terminator,也可能是整个sSrc

&nbsp;&nbsp;&nbsp;&nbsp;//返回结果
&nbsp;&nbsp;&nbsp;&nbsp;return pDestMem;
}

#3


//ReplaceString() 替换字符串的片段(此版本要搜索两次字符串,速度不快,但内存消耗最少)
//copyleft by xingweiwei(alex.xing@163.com, http://b7156.xici.net)
//1999-05-06

//sSrc - 待替换字符串
//sOld - 旧“片段”
//sNew - 新“片段”
//char * - 返回新字符串,记得用完后用 free() 释放
char * ReplaceString(const char * sSrc, const char * sOld, const char * sNew)
{
    //计算 sOld 与 sNew 长度差
    size_t nOldLen = strlen(sOld);
    size_t nNewLen = strlen(sNew);
    signed nDiff = (signed) (nNewLen) - (signed) (nOldLen);

    //搜索统计 pOldStr 中有多少个 sOld
    int nMatch = 0;
    for(char * p = sSrc;;)
    {
        p = strstr(p, sOld);    //搜索匹配片段Match
        if ( p != NULL )        //如果找到一个Match
        {
            nMatch++;           //计数
            p += nOldLen;       //搜索指针指向这个Match之后
        }
        else                    //如果再也找不到
        {
            break;              //搜索结束
        }
    }

    //计算目标字符串长度
    signed nDestLen = (signed) (strlen(sSrc)) + nMatch * nDiff;
    assert ( nDestLen >= 0 );

    //分配空间
    char * pDestMem = (char *) malloc(nDestLen+1);
    if ( pDestMem == NULL )
    {
        return NULL;
    }

    //分段拷贝
    char * pDest = pDestMem;
    char * pSrc = sSrc;
    for(;;)
    {
        char * pMatch = strstr(pSrc, sOld);     //搜索匹配片段Match
        if ( pMatch != NULL )
        {
            size_t nInterLen = pMatch - pSrc;   //相邻Match间的部分Inter的长度
            if ( nInterLen > 0 )
            {
                memcpy(pDest, pSrc, nInterLen); //拷贝Inter
                pDest += nInterLen;             //拷贝宿指针指向Inter之后
            }
            memcpy(pDest, sNew, nNewLen);       //拷贝sNew,为提高效率,此处不用 strcat()
            pDest += nNewLen;                   //拷贝宿指针指向sNew之后
            pSrc = pMatch + nOldLen;            //拷贝源指针指向sOld之后
        }
        else
        {
            break;
        }
    }
    strcpy(pDest, pSrc);       //拷贝最后一个Match后的一段,可能只是一个null-terminator,也可能是整个sSrc

    //返回结果
    return pDestMem;
}

#4


这是C语言(C/C++编译器)的任意字符串的替换函数,该函数“扫描”了两遍字符串:第一遍统计匹配个数,以计算目标字符串长度,精确分配内存;第二遍扫描完成替换。如果只扫描一遍,要么分配一块固定的“足够”大的内存(如果你处理的都是“短”字符串,可以这么做),要么建立一个临时数据结构保存扫描信息,总之要多占内存。

#5


那!我来介绍用C++得general algorithm吧!

#include <algorithm>
#include <string>
#include <vector>

using namespace std;

char  oldchar="/";
char  newchar="//";
char  *a="C;\windows\system";

vector<string> vec(a,a+17);

replace(vec.begin(),vec.end(),oldchar,newchar); //这样newchar 就替换
                                                //oldchar了










#6


自已动手编写一个不也很有趣吗?

#7


C++ 中有 replace() 吗?

#8


C++ 中有 replace() 吗?

#9


CString::Replace

#10


kwok_1980(Mars):

char  oldchar="/";
char  newchar="//";

好象不对吧,再仔细检查一下

这个问题不是一个字符换成另一个字符那么简单:一个字符可能换成几个字符,长度变了。如果字符换字符,我一个循环替换就搞定了,用得着那么麻烦吗?
for (i = 0; i < n; i++)
  if (str[i] == oldchar)
    str[i] = newchar;

#11


to  kwok_1980(Mars) :

vector<string> vec(a,a+17); 什么意思,谢谢!!

#12


#include <vector> 报错

我用的是 TC++3

#13


没有人了吗???

#14


vector<string> vec(a,a+17); 就是初始化变量vec!vec[0],vec[1],vec[2]....vec[16],用起来跟一般的数组差不多
其实vector<string>就相当与一个char类型的数组,但,它是一个class vector
用起来比平时的char a[]灵活好用!它是动态的!

#15


>>>>C++ 中有 replace() 吗?

C++中当然有此函啦!#include <algorithm>
希望你在VC或DEV--C++中编译!

TC3.0不支持最新的C++ Standard

#16


C++标准模板库中的string对次支持的很好,你的TC3.0肯定支持不了的,可以
用VC6或者是BC5.5都能支持。

#include <string>
#include <iostream>
using namespace std;

int main()
{
    string str("your string");
    str.replace('\', "\\");

    cout << str << endl;
}

#17


主要是我的程序必须在 DOS 下运行,用 VC 可以吗?

#18


我的那个程序可以,DOS、UNIX都可以(必须用C++编译器)

#19


我来学习一下

#20