中易网

C++编写一个字符串置换函数

答案:3  悬赏:20  
解决时间 2021-03-08 04:09
c++编程:编写一个字符串置换函数 void repstr(char * source, char * str_s, char * str_d),功能是将source 字符串中的str_s子串替换成字符串 str_d
最佳答案
//字符串替换函数,在字符串 string 中查找 source, 找到则替换为destination,找不到则返回NULL
static char * replace_string (char * string, const char * source, const char * destination )
{
char* sk = strstr (string, source);
if (sk == NULL) return NULL;

char* tmp;
size_t size = strlen(string)+strlen(destination)+1;

char* newstr = (char*)calloc (1, size);
if (newstr == NULL) return NULL;

char* retstr = (char*)calloc (1, size);
if (retstr == NULL)
{
free (newstr);
return NULL;
}

snprintf (newstr, size-1, "%s", string);
sk = strstr (newstr, source);

while (sk != NULL)
{
int pos = 0;
memcpy (retstr+pos, newstr, sk - newstr);
pos += sk - newstr;
sk += strlen(source);
memcpy (retstr+pos, destination, strlen(destination));
pos += strlen(destination);
memcpy (retstr+pos, sk, strlen(sk));

tmp = newstr;
newstr = retstr;
retstr = tmp;

memset (retstr, 0, size);
sk = strstr (newstr, source);
}
free (retstr);
return newstr;

}
全部回答

bool isincluded(const char *lpszres, const char *lpszdst) {  const char *p1 = lpszres;  const char *p2 = lpszdst;  int nreslen = strlen(lpszres);  int ndeslen = strlen(lpszdst);  if(nreslen < ndeslen) return false;  while (p1 != lpszres+nreslen)  {   int nlen = strlen(p1);   if (nlen < ndeslen) return false;   const char *p3 = p1;   p2 = lpszdst;   while (p3 != p1+ndeslen)   {    if(*p3 == *p2)    {     ++p3;     ++p2;     continue;    }    else     break;   }   if(p3 == p1+ndeslen)    return true;   ++p1;  }  return false; }

strlen 还是能用不??

//刚写的code,测试通过,用C++写的 //如果有疑问,欢迎交流 //如果source里有多个str_s字串,那么都会将其替换掉 //这里的条件逻辑,可能有点儿复杂,设定一些状态,用flag表示 //flag: 0表示要往tmp_source里插入字符 //flag: 1表示当前找到了可能是str_s的字串 #include<iostream> #include<string> using namespace std; #define N 1000 void repstr(char * source, char * str_s, char * str_d){ int src_len = strlen(source); char *tmp_source = new char[N]; //创建一个新串,保存替换后的结果 int flag = 0; int cur_idx = 0, str_d_idx = 0, str_s_idx = 0, tmp_idx = 0; while(source[cur_idx] != '\0'){ if(flag == 0 && source[cur_idx] == str_s[0]){ flag = 1; str_s_idx++; cur_idx++; } if(flag == 1){ if(str_s[str_s_idx] == '\0'){ str_d_idx = 0; // while(str_d[str_d_idx]!='\0'){ tmp_source[tmp_idx] = str_d[str_d_idx]; tmp_idx++; str_d_idx++; } str_s_idx = 0; flag = 0; }else if(str_s[str_s_idx] == source[cur_idx]){ str_s_idx++; cur_idx++; }else if(str_s[str_s_idx] != source[cur_idx]){ flag = 0; cur_idx = cur_idx - str_s_idx; str_s_idx = 0; } } if(flag == 0&&source[cur_idx]!='\0'){ tmp_source[tmp_idx] = source[cur_idx]; tmp_idx++; cur_idx++; } } tmp_source[tmp_idx] = '\0'; tmp_idx = 0; while(tmp_source[tmp_idx]!='\0'){ source[tmp_idx] = tmp_source[tmp_idx]; tmp_idx++; } source[tmp_idx] = 0; delete tmp_source; } int main(){ char source[1000] = "word hellonicehelotoyouhellowhy"; cout<<source<<endl; char *src_s = "hello"; char *tar_s = "ChinaFootball"; repstr(source, src_s, tar_s); cout<<source<<endl; return 0; }
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
项目案例分析
圆形基础底面的配筋公式是什么
龙山红日锅炉有限公司我想知道这个在什么地方
OPPO R6007手机内存怎么删除不了呢?有些东西
安装方正扫描仪T2400驱动出现错误代码:0x
男朋友太帅,我自卑!!
宜兴日报社自行车租赁点地址在什么地方,想过
生育保险多久能报下来
DNF隐藏窗口的老板键如QQ一样的有没有
盆栽绿萝水培能成功吗?
上海辛辰商贸有限公司地址在什么地方,想过去
论文的科学性体现在哪些方面
酒可以解愁 什么才可以解恨?
为什么地方两会要比中央两会开的早?
深圳市东方珍品工贸有限公司地址有知道的么?
推荐资讯
我喜欢一个女生,有种莫名的冲动,想说看见她
青岛的期货公司有哪些?还有那些要设立营业部
二阶魔方(⊙o⊙)…公式,最好带图,主要是要
怎么才能让暗中整我的那个卑鄙小人闭嘴,或找
富士康进不了bios设置是什么问题
两个yy同时开,只有一个yy才有声音
山西太原成杰职校好不好呢?
我以前从不相信什么鬼神论的,完全的无神论,
我下载的电影中的人物的语言和底下的字母为什
鲫鱼做出来肉色发红正常吗
有一两位数等于它的十位上的数字和个位上的数
想得太多会让世界变得虚幻日文
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?