C++ 需要将字符串提示的子字符串替换为c++;
我有一个提示,其中可能有%{xyz},应该用一个值替换,[abc]应该用一个字符串替换。然后整个字符串提示必须完整地显示替换后的值 对于ex-“Hello Bla Bla%{var1}[var2]Bye%{var3}测试”应向用户显示为“Hello Bla Bla 23 variable2 Bye 25测试”。 假设我从地图上知道var1和var2的值。我被困在如何分离所有的部分,然后把所有的替换值放在一起C++ 需要将字符串提示的子字符串替换为c++;,c++,string,C++,String,我有一个提示,其中可能有%{xyz},应该用一个值替换,[abc]应该用一个字符串替换。然后整个字符串提示必须完整地显示替换后的值 对于ex-“Hello Bla Bla%{var1}[var2]Bye%{var3}测试”应向用户显示为“Hello Bla Bla 23 variable2 Bye 25测试”。 假设我从地图上知道var1和var2的值。我被困在如何分离所有的部分,然后把所有的替换值放在一起 #include<iostream> #include<string&
#include<iostream>
#include<string>
#include <algorithm>
using namespace std;
int main()
{
std::string s = "Hello Bla Bla %{Hi} [testing] Bye %{bla} Die ";
std::string delimiter = "%";
size_t pos = 0;
std::string token,base;
while ((pos = s.find(delimiter)) != std::string::npos)
{
token = s.substr(0, pos);
base.append(token);
s.erase(0, pos + delimiter.length());
}
base.append(s);
std::cout << base << std::endl;
//Need help here for loop condition to traverse the string for several {}
size_t first = base.find("{");
size_t last = base.find("}");
string strVar = base.substr (first+1,last-first-1);
cout<<strVar<<endl;
base.replace(first,strVar.length()+2,"25");
cout<<base<<endl;
//Need help here for loop condition to traverse the string for several []
size_t third = base.find("[");
size_t fourth = base.find("]");
string strLabel = base.substr (third+1,fourth-third-1);
cout<<strLabel<<endl;
base.replace(third,strLabel.length()+2,"variable1");
cout<<base<<endl;
return 0;
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
std::string s=“Hello Bla Bla%{Hi}[testing]Bye%{Bla}Die”;
std::字符串分隔符=“%”;
大小\u t pos=0;
std::字符串标记,基;
while((pos=s.find(delimiter))!=std::string::npos)
{
令牌=s.substr(0,位置);
base.append(令牌);
s、 擦除(0,pos+分隔符.length());
}
基。附加(s);
Std::CUT> P>如果你要做很多这样的操作,考虑使用模板引擎。在你的例子中最简单的一个就足够了。看一下。你将在几分钟内开始使用,它非常简单。你只需创建一个包含字符串的文件——在你的情况下它看起来像:
"Hello Bla Bla {{var1}} {{var2}} Bye {{var3}} Testing "
然后,通过使用提供的模板引擎函数,您可以从文件中加载此文本,并轻松地用所需的任何内容替换放置在{{}中的片段(查看主页上提供的示例以获得理解)。通过这种方式,您可以替换多个变量,而不必担心在拆分和连接字符串时读/写得太少或太多(通过使用模板引擎,您根本不必这样做)
在您的情况下,任务的代码如下所示(假设您将文本放入名为Example.txt的文件中):
最后一行(结果)中的字符串现在包含要获取的文本:
"Hello Bla Bla 23 variable2 Bye 25 Testing"
此外,由于Plustache附带开放源代码,因此您可以编辑该函数:
std::string template_t::get_template(const std::string& tmpl)
位于template.cpp文件中,因此不需要将文本放在文件中,但可以直接从字符串中读取,如果您不想从文件中读取(如果您不介意,可以保持此函数不变)。库代码并不复杂,您可以很快完成此操作。如何std::string::find
请看一下解释
如果找到位置,请使用std::string::replace
将占位符替换为您自己的文本
好的,现在我明白了。在创建新字符串base
之后,您忘记了在最后一个%
之后添加所有内容
while ((pos = str.find(delim)) <= str.length())
{
base.append(str.substr(0, pos));
std::cout << base << std::endl;
str.erase(0, pos + delim.length());
}
// add this line
base.append(str);
std::cout << base << std::endl;
while((pos=str.find(delim))这对我有效。这是有效的方法吗
#include<iostream>
#include<string>
#include <algorithm>
using namespace std;
int main()
{
std::string s = "Hello Bla Bla %{Hi} [testing] Bye %{bla} Die";
std::string delimiter = "%";
size_t pos = 0;
std::string token,base;
while ((pos = s.find(delimiter)) != std::string::npos)
{
token = s.substr(0, pos);
base.append(token);
s.erase(0, pos + delimiter.length());
}
base.append(s);
std::cout << base << std::endl;
unsigned int first =0;
unsigned int last=0;
while(last<base.length())
{
first = base.find("{",first);
if(first>base.length())
break;
last = base.find("}",first);
string strVar = base.substr (first+1,last-first-1);
base.replace(first,strVar.length()+2,"25");
first=last+1;
}
cout<<base<<endl;
unsigned int third=0;
unsigned int fourth =0;
while(fourth < base.length())
{
third = base.find("[",third);
if(third>base.length())
break;
fourth = base.find("]");
string strLabel = base.substr (third+1,fourth-third-1);
base.replace(third,strLabel.length()+2,"variable1");
third=fourth+1;
}
cout<<base<<endl;
return 0;
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
std::string s=“Hello Bla Bla%{Hi}[testing]Bye%{Bla}Die”;
std::字符串分隔符=“%”;
大小\u t pos=0;
std::字符串标记,基;
while((pos=s.find(delimiter))!=std::string::npos)
{
令牌=s.substr(0,位置);
base.append(令牌);
s、 擦除(0,pos+分隔符.length());
}
基。附加(s);
std::cout Walle,正如您所看到的,我在某些地方使用了find(),也可以使用replace。这里的主要问题是,我需要一个逻辑,使字符串propmt首先不带“%”符号。然后我会在{}或[]之间找到一个子字符串并替换它们。我甚至无法实现第一点。感谢您的帮助。请参阅上面我编辑的代码。我在第一个发生的位置得到替换字符串,但在下一个时间没有。我不确定要执行什么循环条件?
#include<iostream>
#include<string>
#include <algorithm>
using namespace std;
int main()
{
std::string s = "Hello Bla Bla %{Hi} [testing] Bye %{bla} Die";
std::string delimiter = "%";
size_t pos = 0;
std::string token,base;
while ((pos = s.find(delimiter)) != std::string::npos)
{
token = s.substr(0, pos);
base.append(token);
s.erase(0, pos + delimiter.length());
}
base.append(s);
std::cout << base << std::endl;
unsigned int first =0;
unsigned int last=0;
while(last<base.length())
{
first = base.find("{",first);
if(first>base.length())
break;
last = base.find("}",first);
string strVar = base.substr (first+1,last-first-1);
base.replace(first,strVar.length()+2,"25");
first=last+1;
}
cout<<base<<endl;
unsigned int third=0;
unsigned int fourth =0;
while(fourth < base.length())
{
third = base.find("[",third);
if(third>base.length())
break;
fourth = base.find("]");
string strLabel = base.substr (third+1,fourth-third-1);
base.replace(third,strLabel.length()+2,"variable1");
third=fourth+1;
}
cout<<base<<endl;
return 0;
}