【问题标题】:Why does my "string mingling" method return unexpected results?为什么我的“字符串混合”方法会返回意外结果?
【发布时间】:2015-12-27 15:28:09
【问题描述】:

我正在尝试实现一个简单的“字符串混合”方法,它递归地混合两个大小相等的字符串(例如 cat 和 dog 变成 cdaotg -- 字符串 1 的第一个字母,字符串 2 的第一个字母,等等) .

我的方法如下:

string mingleStrings(string s1, string s2, int index) {
    if (index >= s1.length()) {
        return "";
    } else {
        string mingled = "";
        mingled += s1[index] + s2[index];
        mingled += mingleStrings(s1,s2,++index);
        return mingled;
    }
}

当我在我的字符串 (s1[index]) 上使用下标运算符时,它会将整个字符串返回到该索引。要在某个索引处获取字符串的特定字符,我需要输入 s1[index,index]。这对我来说是新的。

【问题讨论】:

  • 您能提供一个MCVE,其中s1[index] 会返回一个完整的子字符串,而s1[index,index] 可以解决这个问题吗?这绝对不应该发生,index,index 只是对index 进行两次评估并使用第二次评估。
  • 不可能吗?

标签: c++ string c++14 subscript


【解决方案1】:

您的代码的问题出在这一行:

mingled += s1[index] + s2[index];

这样做是在index 处添加代码 个字符,然后将添加的结果作为单个字符附加到您的字符串中。

应该是两个独立的操作:

mingled += s1[index];
mingled += s2[index];

这样您每次调用+= 时都会在字符串中附加一个字符,从而产生您期望的结果。

Demo.

【讨论】:

  • 您能详细说明一下吗?有人会认为两个字符串之间的+ 运算符(在+= 的右侧)将首先连接它们,然后连接到左侧的字符串。
  • @AlejandroIván,索引字符串的结果是一个字符,而不是字符串。不幸的是,添加char 会默默地添加数字,而不是在没有强制转换的情况下成为错误(C++ 的做法与 C 在这里所做的完全一样)。
  • @chris 嗯,好点子。没想到,自从我处理字符串/字符差异以来已经有好几年了。谢谢。
  • 这对我来说是不直观的。基于字符串是字符序列的方式,我觉得添加字符意味着连接。不过,感谢您的回答。
  • @Brandon C++ 从 C 继承了这种语义,其中 char 是一个恰好很小的整数类型。除此之外,它的行为类似于整数:您可以加、减,甚至乘除字符。减去字符实际上有用的一个地方是确定数字或数字的序列号:如果你有char c = 'F;`然后你做int pos = c - 'A',那么pos会给你一个从零开始的索引字母表中F 的字母。
猜你喜欢
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 2017-12-25
  • 1970-01-01
  • 2014-12-22
  • 2016-09-02
相关资源
最近更新 更多