Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 需要将字符串提示的子字符串替换为c++;_C++_String - Fatal编程技术网

C++ 需要将字符串提示的子字符串替换为c++;

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&

我有一个提示,其中可能有%{xyz},应该用一个值替换,[abc]应该用一个字符串替换。然后整个字符串提示必须完整地显示替换后的值

对于ex-“Hello Bla Bla%{var1}[var2]Bye%{var3}测试”应向用户显示为“Hello Bla Bla 23 variable2 Bye 25测试”。 假设我从地图上知道var1和var2的值。我被困在如何分离所有的部分,然后把所有的替换值放在一起

#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;
}