怎样将字符串中第一个s%替换为目标字符串?

时间:2021-07-02 05:39:24
CString str="%s love s%,s% doesn't love s%";
CString newStr="You";

我现在只想将str中的第一个s%替换为newStr,怎么弄;

45 个解决方案

#1


先Find,然后把前面复制出来,再加上新字符串,再把后面复制出来。

#2


引用 1 楼 cnzdgs 的回复:
先Find,然后把前面复制出来,再加上新字符串,再把后面复制出来。
如果我只想替换第二个s%呢?

#3


你那s%什么意思?

CString str="%s love %s,%s doesn't love %s"; 
CString newStr="You"; 

CString str2;
str2.Format(str, newStr);

#4


引用 3 楼 sjdev 的回复:
你那s%什么意思?

C/C++ codeCString str="%s love %s,%s doesn't love %s"; 
CString newStr="You"; 
    
CString str2;
str2.Format(str, newStr);
你这样是不行的,不信你试试去。

#5


你看清楚了,我写的是%s不是s%.

#6


CString newStr="You";
CString newStr2="her";
CString newStr3="she";
CString str=_T("");
str.format("%s love %s,%s doesn't love %s",newStr,newStr2,newStr3,newStr);
这样,str的值就是you love her,she doesn't love you
如果你没有贴错,那么,用string的find(),insert()进行操作就可以了

#7


若是s%,并且你想使用Format函数进行格式化,你可以将str这样修改:CString str="%s love s%%,s%% doesn't love s%%";
代码就变成:
CString str="%s love s%%,s%% doesn't love s%%"; 
CString newStr="You"; 

CString str2;
str2.Format(str, newStr);



如果使用串"%s love s%,s% doesn't love s%",然后使用Format的话,程序会报错。
原因很简单,因为Format函数使用的是不定参数,它自动把所有%(x)给当作参数了,然后解析“%,”时,就出错了。

#8


str.Replace("%s",newStr);

#9


引用 5 楼 sjdev 的回复:
你看清楚了,我写的是%s不是s%.
我知道,我上面的写错了,应该全部都是%s, 

CString str="%s love %s,%s doesn't love %s"; 
CString newStr="You"; 
    
CString str2;
str2.Format(str, newStr); 

但是这样还是不行的,你自己试试,%s的数目与后面提供的替代部分数目不一致。

#10


引用 8 楼 coolerhero 的回复:
str.Replace("%s",newStr);
我想知道是替换所有%s其中特定的一个。其他的不变。

#11


引用 9 楼 kezhon 的回复:
但是这样还是不行的,你自己试试,%s的数目与后面提供的替代部分数目不一致。


这还不好说:
CString str="%s love %s,%s doesn't love %s"; 
CString newStr="You"; 

CString str2;
str2.Format(str, newStr, _T("%s"), _T("%s"), _T("%s"));

#12


引用 11 楼 sjdev 的回复:
引用 9 楼 kezhon 的回复:
但是这样还是不行的,你自己试试,%s的数目与后面提供的替代部分数目不一致。


这还不好说:
C/C++ codeCString str="%s love %s,%s doesn't love %s"; 
CString newStr="You"; 
    
CString str2;
str2.Format(str, newStr, _T("%s"), _T("%s"), _T("%s"));
其实我真正的意图在这个帖子里面说的很详细:http://topic.csdn.net/u/20080519/20/7c8b4be7-5254-4f4c-8ec8-e2a2798118a9.html
其实我的问题呢也就是不知道这个str里面会有多少个%s,所以我想搞个循环,每次只替换从左到有第一个,但现在还没找到比较好的替换第一个的方案。

#13


为啥要只替换第一个呢 好奇怪的需求呵呵。

要不试试str2.Format(str, newStr,"\%s", "\%s","\%s");

#14


Format函数是基于不定参数实现的,你后面跟一个参数,那它只会匹配第一个。譬如:
Format("%s %s %s ...", _T("abc"));
这样的话,abc串会对应格式化第一个%s,其他他不管。

#15


引用 14 楼 sjdev 的回复:
Format函数是基于不定参数实现的,你后面跟一个参数,那它只会匹配第一个。譬如:
Format("%s %s %s ...", _T("abc"));
这样的话,abc串会对应格式化第一个%s,其他他不管。
我求求你,你就简单地去试试不行吗,我这样弄了一千遍,检查了一千遍,根本不行,一运行就崩溃了嘛

#16


CString str="%s Love %s,%s doesn't Love %s";
CString newStr="You"; 

CString str2; 
str2.Format(str, newStr);
MessageBox(str2);

这就是我的代码,你看有什么问题?

#17


请认真查看你的代码中的每一个字符,不要出现类似s%这样的情况,我说过了,这肯定会产生断言的。
另外,代码我试了,没有崩溃。

#18


引用 17 楼 sjdev 的回复:
请认真查看你的代码中的每一个字符,不要出现类似s%这样的情况,我说过了,这肯定会产生断言的。
另外,代码我试了,没有崩溃。
那把你的代码贴给我,我试试看,我上面的代码是从程序里面复制过来的。

#19


CString str="%s Love %%s,%%s doesn't Love %%s"; 
CString newStr="You";  

CString str2;  
str2.Format(str, newStr); 
MessageBox(str2); 

#20


引用 19 楼 sjdev 的回复:
C/C++ codeCString str="%s Love %%s,%%s doesn't Love %%s"; 
CString newStr="You";  
    
CString str2;  
str2.Format(str, newStr); 
MessageBox(str2);
原来你是这样,我的是
CString str="%s Love %s,%s doesn't Love %s";
啊,str等于多少有不确定的情况,你这样的%%s从何而来??

#21


若如此,你可在str中查找%,除第一个%外,其他全部多加一个%,即可。

#22


引用 21 楼 sjdev 的回复:
若如此,你可在str中查找%,除第一个%外,其他全部多加一个%,即可。
我的问题也就是在于:怎样将字符串中特定的部分替换成目标部分?

#23


不是替换,是插入。
首先,查找%的位置
如果是第一个,不进行操作,继续
在查找到的%的位置,插入一个%
循环

#24


引用 23 楼 sjdev 的回复:
不是替换,是插入。
首先,查找%的位置
如果是第一个,不进行操作,继续
在查找到的%的位置,插入一个%
循环
怎样查找除第一个之外的其他%s?

#25


还有办法就是使用子串。

譬如:"%s Love %s,%s doesn't Love %s"; 
你首先把它拆成:
str1 = "%s";
str2 = " Love %s,%s doesn't Love %s;

然后CString str3;
str3.Format(str1, newStr);
str3 += str2;

#26


办法是很多的,你仔细看看MSDN吧,很晚了,我就不回帖了。
祝安。

#27


str.Delete(str.Find("s%"),2);
str.Insert(i,newStr);

#28


上面写漏了

int i = str.Find("s%");
str.Delete(i,2); 
str.Insert(i,newStr);

#29


引用 28 楼 coolerhero 的回复:
上面写漏了

int i = str.Find("s%");
str.Delete(i,2);
str.Insert(i,newStr);
哥们,非常感谢你,到目前为止,甚至有几星牛人建议我在底层用汇编写,你这个方法蛮有效。但是如果我想替换的不是第一个%s,而是第二个,或者第三个,总之其中特定的一个,该怎么写?

#30


int pos=1;//第几个替换
int s=0;
for(int i=1;i<=pos;i++)
{
   s = str.Find(s,"%s"); 
   if(i==pos)
   {
      str.Delete(s,2); 
      str.Insert(s,newStr); 
   }
}

#31


int pos=1;//第几个替换 
int s=0; 
for(int i=1;i <=pos;i++) 

   s = str.Find(s,"%s");  
   if(i==pos) 
   { 
      str.Delete(s,2);  
      str.Insert(s,newStr); 
      break;
   } 
   s+=2;//加上偏移
}

#32


不好意思,手写的没调式
有点问题 ,改这句 s = str.Find("%s",s);  

这个是正确的
CString str="%s love %s,%s doesn't love %s"; 
CString newStr="You"; 

int pos=3;//第几个替换 
int s=0; 
for(int i=1;i <=pos;i++) 

   s = str.Find("%s",s);  
   if(i==pos) 
   { 
  str.Delete(s,2);  
  str.Insert(s,newStr);  
   } 
   s+=2;
}

#33


搞个查找循环,
找到一个就替换、跳出

#34


CString str="%s love %s,%s doesn't love %s";
CString newStr="You";

int pos=3;//第几个替换
int s=0;
for(int i=1;i <=pos;i++)
{
s = str.Find("%s",s);
if(i==pos)
{
str.Delete(s,2);
str.Insert(s,newStr);
}
s+=2;//加上偏移
}

#35


引用 34 楼 kezhon 的回复:
CString str="%s love %s,%s doesn't love %s"; 
CString newStr="You"; 

int pos=3;//第几个替换 
int s=0; 
for(int i=1;i  <=pos;i++) 

s = str.Find("%s",s); 
if(i==pos) 

str.Delete(s,2); 
str.Insert(s,newStr); 

s+=2;//加上偏移 
}

正解

不知道有没有replace方法

#36



        Dim str As String = "%s Love %s,%s doesn't Love %s"
        Dim newstr As String = "you"

        Dim pos As Integer
        pos = InStr(2, str, "%s")

        Dim str2 As String = str.Substring(0, pos - 1)

        Dim str3 As String = str.Substring(pos - 1, 2)

        Dim str4 As String = str.Substring(pos + 1, str.Length - pos - 1)

        Dim str5 As String = str3.Replace(str3, newstr)

        Dim str6 As String = str2 + str5 + str4


str6 的结果为:%s Love you,%s doesn't Love %s

#37


up

#38


.........................俺感觉..
串从你要替换的那个字符那里分两段..
把前面换掉后接上后面不就可以了吗:??

CString str="%s love s%,s% doesn't love s%"; 
CString newStr="You"; 

我现在只想将str中的第一个s%替换为newStr,怎么弄;
int i;
i=str.IndexOf('%s');
string string1=str.substring(0,i+1);
string string2=str.substring(i+1,str.legth);
string1=string1.replace(string1,'%s',newStr)+string2;


#39


引用 13 楼 leelittlelong 的回复:
为啥要只替换第一个呢 好奇怪的需求呵呵。 

要不试试str2.Format(str, newStr,"\%s", "\%s","\%s"); 

#40


先看看

#41


CString str;
CString newStr="You"; 
str.Format("%s love s%,s% doesn't love s%",newStr);

#42


引用 41 楼 zhuyaqi2006 的回复:
CString str;
CString newStr="You";
str.Format("%s love s%,s% doesn't love s%",newStr);
别逗了,你真外行!

#43


引用 38 楼 SimpleDay 的回复:
.........................俺感觉.. 
串从你要替换的那个字符那里分两段.. 
把前面换掉后接上后面不就可以了吗:?? 

CString str="%s love s%,s% doesn't love s%";  
CString newStr="You";  

我现在只想将str中的第一个s%替换为newStr,怎么弄; 
int i; 
i=str.IndexOf('%s'); 
string string1=str.substring(0,i+1); 
string string2=str.substring(i+1,str.legth); 
string1=string1.replace(string1,'%s',newSt…


我觉得行

#44


打错了,直接用string提供的功能应该行了

#45


LZ好牛啊!
是替换s%啊。开始我看错了,看成替换%s,
简单一点
size_type string::find (const string& str) const
string& string ::replace (size_type idx, size_type len, const string& str)可以搞定



#1


先Find,然后把前面复制出来,再加上新字符串,再把后面复制出来。

#2


引用 1 楼 cnzdgs 的回复:
先Find,然后把前面复制出来,再加上新字符串,再把后面复制出来。
如果我只想替换第二个s%呢?

#3


你那s%什么意思?

CString str="%s love %s,%s doesn't love %s"; 
CString newStr="You"; 

CString str2;
str2.Format(str, newStr);

#4


引用 3 楼 sjdev 的回复:
你那s%什么意思?

C/C++ codeCString str="%s love %s,%s doesn't love %s"; 
CString newStr="You"; 
    
CString str2;
str2.Format(str, newStr);
你这样是不行的,不信你试试去。

#5


你看清楚了,我写的是%s不是s%.

#6


CString newStr="You";
CString newStr2="her";
CString newStr3="she";
CString str=_T("");
str.format("%s love %s,%s doesn't love %s",newStr,newStr2,newStr3,newStr);
这样,str的值就是you love her,she doesn't love you
如果你没有贴错,那么,用string的find(),insert()进行操作就可以了

#7


若是s%,并且你想使用Format函数进行格式化,你可以将str这样修改:CString str="%s love s%%,s%% doesn't love s%%";
代码就变成:
CString str="%s love s%%,s%% doesn't love s%%"; 
CString newStr="You"; 

CString str2;
str2.Format(str, newStr);



如果使用串"%s love s%,s% doesn't love s%",然后使用Format的话,程序会报错。
原因很简单,因为Format函数使用的是不定参数,它自动把所有%(x)给当作参数了,然后解析“%,”时,就出错了。

#8


str.Replace("%s",newStr);

#9


引用 5 楼 sjdev 的回复:
你看清楚了,我写的是%s不是s%.
我知道,我上面的写错了,应该全部都是%s, 

CString str="%s love %s,%s doesn't love %s"; 
CString newStr="You"; 
    
CString str2;
str2.Format(str, newStr); 

但是这样还是不行的,你自己试试,%s的数目与后面提供的替代部分数目不一致。

#10


引用 8 楼 coolerhero 的回复:
str.Replace("%s",newStr);
我想知道是替换所有%s其中特定的一个。其他的不变。

#11


引用 9 楼 kezhon 的回复:
但是这样还是不行的,你自己试试,%s的数目与后面提供的替代部分数目不一致。


这还不好说:
CString str="%s love %s,%s doesn't love %s"; 
CString newStr="You"; 

CString str2;
str2.Format(str, newStr, _T("%s"), _T("%s"), _T("%s"));

#12


引用 11 楼 sjdev 的回复:
引用 9 楼 kezhon 的回复:
但是这样还是不行的,你自己试试,%s的数目与后面提供的替代部分数目不一致。


这还不好说:
C/C++ codeCString str="%s love %s,%s doesn't love %s"; 
CString newStr="You"; 
    
CString str2;
str2.Format(str, newStr, _T("%s"), _T("%s"), _T("%s"));
其实我真正的意图在这个帖子里面说的很详细:http://topic.csdn.net/u/20080519/20/7c8b4be7-5254-4f4c-8ec8-e2a2798118a9.html
其实我的问题呢也就是不知道这个str里面会有多少个%s,所以我想搞个循环,每次只替换从左到有第一个,但现在还没找到比较好的替换第一个的方案。

#13


为啥要只替换第一个呢 好奇怪的需求呵呵。

要不试试str2.Format(str, newStr,"\%s", "\%s","\%s");

#14


Format函数是基于不定参数实现的,你后面跟一个参数,那它只会匹配第一个。譬如:
Format("%s %s %s ...", _T("abc"));
这样的话,abc串会对应格式化第一个%s,其他他不管。

#15


引用 14 楼 sjdev 的回复:
Format函数是基于不定参数实现的,你后面跟一个参数,那它只会匹配第一个。譬如:
Format("%s %s %s ...", _T("abc"));
这样的话,abc串会对应格式化第一个%s,其他他不管。
我求求你,你就简单地去试试不行吗,我这样弄了一千遍,检查了一千遍,根本不行,一运行就崩溃了嘛

#16


CString str="%s Love %s,%s doesn't Love %s";
CString newStr="You"; 

CString str2; 
str2.Format(str, newStr);
MessageBox(str2);

这就是我的代码,你看有什么问题?

#17


请认真查看你的代码中的每一个字符,不要出现类似s%这样的情况,我说过了,这肯定会产生断言的。
另外,代码我试了,没有崩溃。

#18


引用 17 楼 sjdev 的回复:
请认真查看你的代码中的每一个字符,不要出现类似s%这样的情况,我说过了,这肯定会产生断言的。
另外,代码我试了,没有崩溃。
那把你的代码贴给我,我试试看,我上面的代码是从程序里面复制过来的。

#19


CString str="%s Love %%s,%%s doesn't Love %%s"; 
CString newStr="You";  

CString str2;  
str2.Format(str, newStr); 
MessageBox(str2); 

#20


引用 19 楼 sjdev 的回复:
C/C++ codeCString str="%s Love %%s,%%s doesn't Love %%s"; 
CString newStr="You";  
    
CString str2;  
str2.Format(str, newStr); 
MessageBox(str2);
原来你是这样,我的是
CString str="%s Love %s,%s doesn't Love %s";
啊,str等于多少有不确定的情况,你这样的%%s从何而来??

#21


若如此,你可在str中查找%,除第一个%外,其他全部多加一个%,即可。

#22


引用 21 楼 sjdev 的回复:
若如此,你可在str中查找%,除第一个%外,其他全部多加一个%,即可。
我的问题也就是在于:怎样将字符串中特定的部分替换成目标部分?

#23


不是替换,是插入。
首先,查找%的位置
如果是第一个,不进行操作,继续
在查找到的%的位置,插入一个%
循环

#24


引用 23 楼 sjdev 的回复:
不是替换,是插入。
首先,查找%的位置
如果是第一个,不进行操作,继续
在查找到的%的位置,插入一个%
循环
怎样查找除第一个之外的其他%s?

#25


还有办法就是使用子串。

譬如:"%s Love %s,%s doesn't Love %s"; 
你首先把它拆成:
str1 = "%s";
str2 = " Love %s,%s doesn't Love %s;

然后CString str3;
str3.Format(str1, newStr);
str3 += str2;

#26


办法是很多的,你仔细看看MSDN吧,很晚了,我就不回帖了。
祝安。

#27


str.Delete(str.Find("s%"),2);
str.Insert(i,newStr);

#28


上面写漏了

int i = str.Find("s%");
str.Delete(i,2); 
str.Insert(i,newStr);

#29


引用 28 楼 coolerhero 的回复:
上面写漏了

int i = str.Find("s%");
str.Delete(i,2);
str.Insert(i,newStr);
哥们,非常感谢你,到目前为止,甚至有几星牛人建议我在底层用汇编写,你这个方法蛮有效。但是如果我想替换的不是第一个%s,而是第二个,或者第三个,总之其中特定的一个,该怎么写?

#30


int pos=1;//第几个替换
int s=0;
for(int i=1;i<=pos;i++)
{
   s = str.Find(s,"%s"); 
   if(i==pos)
   {
      str.Delete(s,2); 
      str.Insert(s,newStr); 
   }
}

#31


int pos=1;//第几个替换 
int s=0; 
for(int i=1;i <=pos;i++) 

   s = str.Find(s,"%s");  
   if(i==pos) 
   { 
      str.Delete(s,2);  
      str.Insert(s,newStr); 
      break;
   } 
   s+=2;//加上偏移
}

#32


不好意思,手写的没调式
有点问题 ,改这句 s = str.Find("%s",s);  

这个是正确的
CString str="%s love %s,%s doesn't love %s"; 
CString newStr="You"; 

int pos=3;//第几个替换 
int s=0; 
for(int i=1;i <=pos;i++) 

   s = str.Find("%s",s);  
   if(i==pos) 
   { 
  str.Delete(s,2);  
  str.Insert(s,newStr);  
   } 
   s+=2;
}

#33


搞个查找循环,
找到一个就替换、跳出

#34


CString str="%s love %s,%s doesn't love %s";
CString newStr="You";

int pos=3;//第几个替换
int s=0;
for(int i=1;i <=pos;i++)
{
s = str.Find("%s",s);
if(i==pos)
{
str.Delete(s,2);
str.Insert(s,newStr);
}
s+=2;//加上偏移
}

#35


引用 34 楼 kezhon 的回复:
CString str="%s love %s,%s doesn't love %s"; 
CString newStr="You"; 

int pos=3;//第几个替换 
int s=0; 
for(int i=1;i  <=pos;i++) 

s = str.Find("%s",s); 
if(i==pos) 

str.Delete(s,2); 
str.Insert(s,newStr); 

s+=2;//加上偏移 
}

正解

不知道有没有replace方法

#36



        Dim str As String = "%s Love %s,%s doesn't Love %s"
        Dim newstr As String = "you"

        Dim pos As Integer
        pos = InStr(2, str, "%s")

        Dim str2 As String = str.Substring(0, pos - 1)

        Dim str3 As String = str.Substring(pos - 1, 2)

        Dim str4 As String = str.Substring(pos + 1, str.Length - pos - 1)

        Dim str5 As String = str3.Replace(str3, newstr)

        Dim str6 As String = str2 + str5 + str4


str6 的结果为:%s Love you,%s doesn't Love %s

#37


up

#38


.........................俺感觉..
串从你要替换的那个字符那里分两段..
把前面换掉后接上后面不就可以了吗:??

CString str="%s love s%,s% doesn't love s%"; 
CString newStr="You"; 

我现在只想将str中的第一个s%替换为newStr,怎么弄;
int i;
i=str.IndexOf('%s');
string string1=str.substring(0,i+1);
string string2=str.substring(i+1,str.legth);
string1=string1.replace(string1,'%s',newStr)+string2;


#39


引用 13 楼 leelittlelong 的回复:
为啥要只替换第一个呢 好奇怪的需求呵呵。 

要不试试str2.Format(str, newStr,"\%s", "\%s","\%s"); 

#40


先看看

#41


CString str;
CString newStr="You"; 
str.Format("%s love s%,s% doesn't love s%",newStr);

#42


引用 41 楼 zhuyaqi2006 的回复:
CString str;
CString newStr="You";
str.Format("%s love s%,s% doesn't love s%",newStr);
别逗了,你真外行!

#43


引用 38 楼 SimpleDay 的回复:
.........................俺感觉.. 
串从你要替换的那个字符那里分两段.. 
把前面换掉后接上后面不就可以了吗:?? 

CString str="%s love s%,s% doesn't love s%";  
CString newStr="You";  

我现在只想将str中的第一个s%替换为newStr,怎么弄; 
int i; 
i=str.IndexOf('%s'); 
string string1=str.substring(0,i+1); 
string string2=str.substring(i+1,str.legth); 
string1=string1.replace(string1,'%s',newSt…


我觉得行

#44


打错了,直接用string提供的功能应该行了

#45


LZ好牛啊!
是替换s%啊。开始我看错了,看成替换%s,
简单一点
size_type string::find (const string& str) const
string& string ::replace (size_type idx, size_type len, const string& str)可以搞定