【问题标题】:I can't double characters inside string with function我不能用函数在字符串中加倍字符
【发布时间】:2021-01-05 03:33:18
【问题描述】:

我正在尝试创建一个简单的函数,将字符串中的字符加倍并输出新字符串。前任。 “hello world”会变成“hheelloo wwoorrlldd” 但是,使用我编写的函数,输出是空的。如果有人能告诉我为什么会这样,我将不胜感激。谢谢!

using namespace std;
string doubleChar(string str) {
    string newString;
    for(int i =0;i<str.size();++i){
        newString[i] = str[i];
        newString[i+1] = str[i];
    }
    return newString;
}

【问题讨论】:

  • newString[i+1] = str[i]; 写入字符串的边界并调用未定义的行为。一般operator[]不会在字符串中添加新字符,它只会替换现有的,所以你的逻辑不起作用
  • 您必须确保为新字符分配了存储空间。 newString[i] = str[i]; newString[i+1] = str[i]; 可以访问存储之外的内容。请改用newString += str[i]; newString += str[i];(或事先确保newString 的大小合适)。
  • newString.append(1, str[i]).append(1, str[i]) 可以替换你的 for 循环。
  • @WhozCraig 正如你提到的std::string::append():为什么不newString.append(2, str[i]);? ;-)
  • @Scheff Derp。那将是整个森林换树木的事情。这将教我在凌晨时评论 SO。你当然是对的。

标签: c++ string function


【解决方案1】:

问题是,newString 总是空的,它不包含任何元素。像 newString[i]newString[i+1] 这样访问它会导致 UB。

你需要给它添加元素,例如

string doubleChar(const string& str) { // apply pass-by-reference to avoid copy
    string newString;
    newString.reserve(str.size() * 2); // reserve the capacity to avoid reallocation
    for(int i =0;i<str.size();++i){
        newString += str[i];
        newString += str[i];
        // or use push_back or append
    }
    return newString;
}

【讨论】:

  • 明白了。感谢您的帮助。
【解决方案2】:

虽然songyuanyao的解决方案不错,但我觉得可以使用更多的C++函数...

#include <string>
#include <string_view>

// use string view, so a character array is also accepted
std::string DoubleChar(std::string_view const &str) noexcept {
    std::string newString;
    newString.reserve(str.size() * 2);
    for (auto character : str) { // use range based loop
        newString.append(2, character); // append the character twice
    }
    return newString;
}

#include <iostream>

int main() {
    std::string const str = "Hello world";

    std::cout << DoubleChar(str) << '\n';
}

【讨论】:

    【解决方案3】:
    using namespace std;
    string doubleChar(string str) {
        string newString(str.size() * 2, '\0');
        for(int i =0;i<str.size();++i){
            newString[2*i] = str[i];
            newString[2*i+1] = str[i];
        }
        return newString;
    }
    

    结果的长度应该是输入的两倍。并且 index 应该乘以 2。

    【讨论】:

    • 预先分配应该防止在添加字符时重新分配(这不是最糟糕的事情)。除此之外,我什至没有意识到写作索引的问题...... ;-)
    猜你喜欢
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多