用一组字符替换所有字符

Posted

技术标签:

【中文标题】用一组字符替换所有字符【英文标题】:Replace All Characters with a set of characters 【发布时间】:2015-09-28 23:56:37 【问题描述】:

我正在尝试用另一组字符替换字符串中的每个字符

for example a -> ABC
            b -> BCA
            d -> CBA

但我似乎对这个看似简单的任务有问题

到目前为止我有

#include <isotream>
#include "Class.h"
#include <string>
using namespace std;
  int main()
      string test;
      cin >> test;
      Class class;
      cout << class.returnString(test);

在我打电话的班级中,我有

#include "Class.h" //which has <string> <iostream> and std
static string phrase;
static string whole;
static int place;
Class::Class()
if (phrase != "")
    phrase = "";

if (whole != "")
    whole = "";

if (place == NULL)
    place = 0;



void Class::reader(string x)
    char symbol = x.at(place);
    while (symbol != '\0')
       place++;
       replacer(symbol);
       reader(x);
   

void Class::replacer(char x)
    if (char x = 'a')
        phrase = "hola";
    
    if (char x = 'b')
        phrase = "hi";
    
    knitter();
 
void Class::knitter()
    whole = whole + phrase;


string Class::returnString(string x)
    reader(x);
    return whole;

当我尝试在测试字符串中仅使用“a”运行它时,我不断收到无效的字符串位置作为错误。

【问题讨论】:

place 是一个你永远不会正确初始化的 int。在Class 的构造函数中,您检查它是否为空,但它是int,而不是指针。所以它没有被初始化,比较的结果是未定义的,place 未设置为 0,并且在reader 中,您在place 访问字符串x,正如所说的未定义。但是,如果您编辑问题以解释错误发生在哪一行,这将有所帮助;我猜是我指出的那个,但我还是想听听你的意见。 if (char x = 'a') - 天哪。请打开编译器的警告。 除了@FabioTurati 和@KarolyHorvath cmets,if (char x = 'a') ... = 不检查相等性,它是赋值运算符。 == 检查是否相等。更不用说x 已经在方法的签名(void Class::replacer(char x))中声明为char,不要在if 语句中声明变量。 @FabioTurati 我不确定如何检查我的错误在哪里,因为我对编码比较陌生。我目前正在使用 microsoft visual studio express 2013 for windows 桌面。当我运行程序时,它启动得很好,但是当我在控制台中输入“a”并按回车时,程序崩溃了,我得到了 xmemory0 或 xstring。 (取决于我在void Class::reader(string x) 之外是否有place = 0 while loop。在xstring 中,我被带到_Xout_of_range("invaluid string position")。在xmemory0 中,我被带到if(_Count == 0)... else if(...) 声明 那么,使用调试器!您可以单步执行您的代码,一次一行,看看会发生什么。或者,一个懒惰的解决方案是用couts 填充您的代码,让您了解正在发生的事情。这是为了隔离问题出现的点。但与此同时,请检查我们指出的内容。您遇到的问题(无效的字符串位置)可能取决于我所说的(place 未初始化),但其他错误可能更糟 - 在if 中,您必须使用 double相等,即if (char x == 'a'),否则不会做你想做的。 【参考方案1】:

在'symbol'下面的while循环中,'symbol'将永远是'a'。

void Class::reader(string x)
    char symbol = x.at(place);
    while (symbol != '\0')
       place++;
       replacer(symbol);
       reader(x);
   

您需要在 while 循环中读取“x”,否则您的 while 循环永远不会终止。在无限程序中调用 knitter 将使“整体”看起来像:“holaholaholahola ....”,您的程序最终将耗尽堆栈内存,这可能是您收到无效字符串位置错误的原因。此外,作为一般规则,我会避免使用静态变量。如果您按以下方式更改程序,它可能会起作用:

void Class::reader(string x)
    char symbol = x.at(place);
    while (symbol != '\0')
       place++;
       replacer(symbol);
       reader(x);
       symbol = x.at(place);
   

【讨论】:

他可能也想修复void Class::replacer(char x) ... 方法...

以上是关于用一组字符替换所有字符的主要内容,如果未能解决你的问题,请参考以下文章

用一组单词数组中的随机单词替换字符串中的整个单词

替换出现在两个特定单词之间的一组字符串的所有出现

Java:用其他不同的字符替换一组字符

如何替换 Java 字符串中的一组标记?

用R中的组中的非NA字符替换一组值的NA [重复]

如果没有替换,Python字符串替换文件而不触及文件