【问题标题】:'Replace' a char with an int in a string用字符串中的 int '替换' char
【发布时间】:2024-01-08 09:20:01
【问题描述】:

起初这似乎很容易做到,但我错了。 我想用 int(值)“替换”字符串中的 char(变量)。但是怎么做呢?

我尝试了 replace(),因为我正在处理一个字符串并且它有效,但如果我希望将变量的值再次更改为另一个,它将不起作用 值,因为这样就找不到原始变量。在过去的两天里,我一直在为此苦苦挣扎。任何有关如何执行此操作的帮助将不胜感激。

changeVar(string startingExpr, char var, int val)
{
    for(int i = 0; i < startingExpr.length(); i++)
    {
        if(startingExpr[i] == var)
        {
            cout << "I found x! Now to replace it!";
            startingExpr[i] = val;       //'Replace' x with 5, but x but how?
        }
    }
}

非常感谢您对此提供的帮助。

J

【问题讨论】:

  • 如果val 始终是一位数字,那么startingExpr[i] = val + '0'; 应该可以解决问题。否则,您需要通过将val 格式化为十进制,在给定位置插入其字符串表示形式。谷歌std::string的方法文档,如findremoveeraseinsert
  • 您正在重新发明std::replace,但有了输出,您可以使用std::replace_if 来完成。
  • 与其认为这是修改原始字符串,不如将其视为原始字符串的一部分(如此处 x 之前和之后的部分)。然后将您想要的旧部分与新部分(在本例中为 int 值作为字符串)组合以获得新字符串。
  • 当字符出现在你不想替换的句子的单词中时,我希望你意识到问题......就像在"Here's the value for x: x!"中如果字符串是某种格式应用程序中的字符串,请考虑一些特殊的语法,例如 "Here's the value for x: $(x)!" 来支持句子中的任意单词。
  • 关于您最初的问题,您为什么会遇到所描述的问题?据我所知,您传递字符串按值,这意味着函数更改它的副本。 (我看不出你用它做什么,因为你没有在你的代码中显示它。)总结:请告诉我们更多/添加更多代码。

标签: c++ string char int


【解决方案1】:

如果您希望能够多次将“变量”替换为“值”,则应保留原始字符串的副本并仅从那里进行替换。

另一个选项是撤消替换(用变量替换值)并用另一个值重做,前提是撤消可以明确地完成。

【讨论】:

    【解决方案2】:

    很遗憾听到这个问题浪费了您 2 多天的时间。您应该仔细阅读基本的 C++ 教科书。因为你的问题是一个非常基本的问题。如果你理解函数传递的参数,你会解决这个问题的!

    更具体地说,你的功能没有错,只是没有提供你想要的结果。因为您的函数使用参数,这将在函数主体内制作参数startingExpr的副本,所以当您使用“startingExpr [i] = val”进行替换时,替换发生在startingExpr的副本上(这是一个可见的局部变量在函数内部),你原来的startingExpr确实发生了变化。

    解决方法很简单,改变参数传入它的引用,加&,现在你的函数声明应该是:“changeVar(string startingExpr, char var, int val)”

    试试下面的代码,它会演示我的解释:

        #include <iostream>
        #include <string>
    
        using namespace std;
    
        //the original function which was reported had problem
        // This because the function using parameter not reference
    
        void changeVar(string startingExpr, char var, int val)
        {
            for(int i = 0; i < startingExpr.length(); i++)
            {
                if(startingExpr[i] == var)
                {
                    cout << "I found x! Now to replace it!(But the replace is happend inside the function, the original string is not changed!)"<<endl;
                    startingExpr[i] = val;       //'Replace' x with 5, but x but how?
                }
            }
        }
        // updating using the reference 
        //void changeVar(string & startingExpr, char var, int val)
        void changeVar_refe(string & startingExpr, char var, int val)
        {
            for(int i = 0; i < startingExpr.length(); i++)
            {
                if(startingExpr[i] == var)
                {
                    cout << "I found x! Now to replace it!(Now using reference, the replace is happend inside the original string, which will be changed!)"<<endl;
                    startingExpr[i] = val;       //'Replace' x with 5, but x but how?
                }
            }
        }
    
        int main()
        {
    
            //lets test the original function
    
            string my_name="Hi there, I am C++ taoism .";
            cout<<"The original string is: "<<my_name<<endl;
            //lets change a to A
            changeVar(my_name,'a',65);    
            cout<<"The changed string is: "<<my_name<<endl;
    
            cout<<endl;
            cout<<"Using the reference to test ... "<<endl;
            cout<<endl;
    
            cout<<"The original string is: "<<my_name<<endl;
            //lets change a to A
            changeVar_refe(my_name,'a',65);    
            cout<<"The changed string is: "<<my_name<<endl;
    
            //cout <<"Char A is int 65:"<<int('A')<<endl;
    
        }
    

    【讨论】:

    • 谢谢! & 是有道理的,但是当我使用它时,它会给我这样的输出:♣ * (2 + 3) 而不是 5 * (2 + 3) 例如。
    • code //将 x * (2 + 3) 中的 x 替换为 5*(2+3) // 在 ASCII 表示中,5 表示为 53 string test_str = "x * (2 + 3)"; changeVar_refe(test_str,'x',53); coutcode
    • 试试这个:string test_str = "x * (2 + 3)"; changeVar_refe(test_str,'x',53); cout
    【解决方案3】:

    您的错误是分配的数字与 ASCII 字符表示不同。在 ASCII 表字符中,'0'、'1' .. '9' 一个接一个。因此,您可以将代码重写为:

    startingExpr[i] = '0' + val;
    

    但请注意,这仅适用于一个字符大小写。如果您需要替换多个字符,那么不需要函数的解决方案是:

    #include <iostream>
    #include <string>
    
    int
    main()
    {
      std::string a("SomeVar1"), b("SomeVar356");
    
      std::string::size_type index = std::string::npos;
    
      std::cout << "Before: " << a << std::endl;
      if ((index = a.rfind("1")) != std::string::npos)
        a.replace(index, 1, std::to_string(2));
      std::cout << "After: " << a << std::endl;
    
      std::cout << "Before: " << b << std::endl;
      if ((index = b.rfind("356")) != std::string::npos)
        b.replace(index, 3, std::to_string(673));
      std::cout << "After: " << b << std::endl;
    
      return 0;
    }
    

    由于它使用 rfind(从字符串末尾搜索),所以稍微优化了一下。

    附:正如 cmets 所建议的那样 - 您可以将 std::replace 与反向迭代器和 lambda 用于条件。因为它在 C++11 中可用,所以我写了一个通用风格的小例子。

    【讨论】:

      最近更新 更多