问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c++的字符数组替换,请高手指教~

发布网友 发布时间:2023-04-05 08:53

我来回答

3个回答

热心网友 时间:2024-12-01 11:04

1.下面的代码是不调用任何库函数完成字符串的查找和替换的代码:
#include <iostream>
using namespace std;

// 求字符串长度函数
int strlength(char *s)
{
int count = 0;
while(*s++ != '\0') count ++;
return count;
}

// 搜索字串出现的位置
int search(char *s, char *subs, int *mark)
{
unsigned int i = 0, j = 0, f = 0, mlen = 0;
for (i = 0; i <= strlength(s) - strlength(subs); i++)
{
f = 1;
for (j = 0; j < strlength(subs); j++)
{
if (*(s + i + j) != *(subs + j))
{
f = 0;
break;
}
}
if (f)
{
*(mark+mlen) = i;
mlen ++;
i += strlength(subs) - 1;
}
}
return mlen;
}

// 替换确定位置的字串
void replaces(char *s, char *old, char *news, int position)
{
int lold = strlength(old);
int lnew = strlength(news);
int len = abs(lold - lnew);
int old_start = position, old_end = lold + old_start;
int i = 0;
if (lold > lnew)
{
for (i = 0; i < lnew; i++)
{
*(s + i + old_start) = *(news + i);
}

for (i = lnew + old_start; i < (int)strlength(s); i++)
{
*(s + i) = *(s + len + i);
}
*(s + i) = '\0';
}

else
{
for (i = strlength(s); i >= old_end; i--)
{
*(s + len + i) = *(s + i);
}
*(s + strlength(s) + len) = '\0';

for (i = 0; i < lnew; i++)
{
*(s + i + old_start) = *(news + i);
}
}
}

void main()
{
char str[100];
char substr[20];
char newstr[20];
int *mark,mlen,i = 0,j = 0;

cout << "请输入主字符串:"<< endl;
cin.getline(str, 100, '\n');
cout << "请输入要替换的字符串:"<< endl;
cin.getline(substr, 100, '\n');
cout << "请输入要替换成的字符串:" << endl;
cin.getline(newstr, 100, '\n');

mlen = strlength(str)/strlength(substr);
mark = (int *)malloc(sizeof(int) * mlen);
mlen = search(str,substr,mark);

cout << "子字符串在主字符串中出现的位置为:" << endl;
for (i = 0; i < mlen; i++)
{
cout << *(mark + i) << " ";
}
cout << endl;

for (i = 0; i < mlen; i++)
{
replaces(str,substr,newstr,*(mark +i));
for (j = i + 1; j < mlen; j++)
{
*(mark + j) = *(mark + j) + strlength(newstr) - strlength(substr);
}
}
cout << "替换后的字符串为:\n" << str << endl;
}

2.下面是调用库函数完成字符串查找替换的代码:
#include <iostream>
#include <string>
using namespace std;

void search(string str, string sub)
{
int index = str.find(sub);
cout << "子字符串在主字符串中出现的位置为:" << endl;
while(index >= 0 && index < str.length())
{
cout << index << " ";
index = str.find(sub, index + sub.length());
}
cout << endl;
}

void replaces(string &str, string sub, string news)
{
int index = str.find(sub);
while(index >= 0 && index < str.length())
{
str = str.replace(index, sub.length(), news);
index = str.find(sub, index + news.length());
}
}

void main()
{
string str = "asdfasdfasdf";
string sub = "df";
string news = "123";
search(str, sub);
replaces(str, sub, news);
cout << "替换后的字符串为:" << endl;
cout << str << endl;
}

两个程序对照着看一下,希望对你以后的学习有所帮助

热心网友 时间:2024-12-01 11:04

我刚写了个函数,用GCC调试通过,希望没bug。

两个字符数组必须有'\0'终止字符串,不然就出错。

#include <iostream>
using namespace std;

int main(int argc, char **argv) {
//找出s2在s1中第一次出现的位置,没有则返回-1。
int findstr(char* s1, char*s2);
char a[]="asdfgzxgzx", b[]="gz";
int loc=findstr(a, b);
if (loc<0) cout << "字符串2在字符串1中不存在!" << endl;
else cout << "字符串2在字符串1中第一次出现的位置: " << loc << endl;
return 0;
}
int findstr(char* s1, char*s2) {
char *p1=s1, *p2=NULL;
while (*p1 != '\0') {
p2=s2;
while ('\0'!=*p1 && '\0'!=*p2)
if (*p2++ != *p1++) break;
if (*(p1-1)==*(p2-1) && '\0'==*p2)
return (p1-s1)-(p2-s2)+1;
//这里加不加1你说了算。
if ('\0'==*p1) return -1;
}
}

热心网友 时间:2024-12-01 11:05

#include <iostream>
using namespace std;

void search(char* a,char* b)
{
bool panan=false;
int a1=0;//记录i
for (int i=0,j=0;a[i]!=NULL;i++)
{
cout<<"222";
if ((a[i]==b[j])&&!panan)
{
if (a1==0)
{
a1=i;
}
if(b[j+1]==NULL)
{
panan=true;
break;
}
j++;
}
else
{
continue;
}
}
if (!panan)
{
cout<<"没有包含"<<endl;
}
else
{
cout<<"第"<<a1<<"个数开始包含"<<endl;
}

}

int main()
{
char str[100];//本来想定义指针然后用strlen获取长度之后NEW的,不过既然不能用,那我就定义成100的字符数组了
char sub[100];//
cout << "请输入主字符串: ";
cin>> str;
cout << "请输入子字符串: ";
cin >> sub;
search(str,sub);
return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
请问昆山正仪到江苏省昆山市出口加工区新竹路99号 怎么坐班车最近? 跪求苏州神达电脑地址!!! 华为运动耳机挂脖式怎么配对 雅酷美挂脖式无线蓝牙防水耳机-运动时尚,自由畅听 已知函数f(x)=cos^2x-sin^2x+2根号3sinxcosx+1 原先微信有联系后来突然对方要求我对他进行朋友验证我没有他电话号码... 已知函数f(x)=cos^2x-sin^2x+2根号3sinxcosx 已知函数fx=cos^2*x-sin^2*x+2sinx*cosx,求fx的最小正周期,并求当... 已知函数f(x)=cos2x-sin2x 4sinx·cosx求f(x)的最小正周期,并求当x为... 已知f(x)=cos^2x-sin^x+2sinxcosx。①求函数最小正周期②当x∈【0... photoshop用前景色填充路径的时候 填充的是路径之外的东西 怎么办_百 ... 剑网三重置身份证失败多久可以再申请 微信背景音乐你有很多事放不下吗叫什么 imirror怎么连接iphone unity一直正在安装怎么办 unity一直加载不完 阿弥陀的意思和含义 佛教词语弥陀名号什么意思?如何解释? oppor7用全民K歌的时候为什么不能耳机返听,是不支持么?还是需要用专业... 天谕手游小王子的信位置 天谕渠道服怎么下载完整资源包 唐李高德称冥王是什么意思 冥王和阎王的区别 冥王和阎王是同一类人吗 把iwatch从icloud移除还用删除个人信息吗 vivo y33s和vivos 9e 哪个好点? 白居易写荆轲的诗词 arcgis拉伸图例有多出来的线 arcgis折线怎么变曲线 秉臬的成语秉臬的成语是什么 危臬的成语危臬的成语是什么 梦见儿子被毒蛇咬的预兆 梦见别人被毒蛇咬的预兆 女宝宝姓温用什么成语起名 oppo手机如何申请深度测试 企业投标,需要开具无安全事故证明,请问这个证明在哪里开?我是南京的... ubuntu安装出错,求大神指点 这个怎么解决啊? ubuntu12.04安装时 出现问题 ubuntu 12.04安装 出现问题,求教。 A83T开发板支持什么样系统? 音乐频道变成了上海外语频道 音乐频道去哪了 貌似格不到的样子... 很抱歉,&quot;music channel&quot;已停止运行 微信通信录联系人报120人,而实际一数90人,什么原因? 普票不能抵扣为什么要开 为什么有人买普通发票又不能抵税款 请问普票不可以抵扣有什么用呢? 打算入手一块手机,三星s7edeg。还是苹果7。还是vivox9plus。_百度... 怎么在excel中的多行单元格中原有的数据前面增加相同的数字,比如,行1... 为什么好多人用“活的窝囊、死的荒唐”来评价张国荣? 生的荒唐,死的窝囊。 这是指的哪一些人啊?