如何在C ++ 11中更改字符串中的所有字符?

时间:2014-01-26 11:17:23

标签: c++ c++11

我想要一个字符串想要将所有字符更改为"X",这是我到目前为止所处的位置。

#include<iostream>
#include<string>
#include<cctype>

using namespace std;

int main() {
    string line;
    getline(cin, line);
    for (decltype(line.size() index = 0; index != line.size(); ++index)) {
        line[index] = "X";
    }
    cout << line << endl;
    return 0;
}

我想将所有字符更改为"X"。请帮助。

更新代码:

#include<iostream>
#include<string>
#include<cctype>

using namespace std;

int main() {
    string line;
    getline(cin, line);
    for (decltype(line.size()) index = 0; index != line.size(); ++index) {
        if (isspace(line[index])) {
            line[index] += 1;
            continue;
        }
        else {
            line[index] = 'X';
        }
    }
    cout << line << endl;
    return 0;
}

它在字符串之间的空格中打印!,如何解决。

5 个答案:

答案 0 :(得分:6)

使用填充构造函数

line = std::string(line.size(), 'X');

在c ++ 11中,内部缓冲区将被移动,而不是被复制。

但是如果你想避免分配一个新的缓冲区(同时丢弃旧的缓冲区),你会想要同意其中一个答案。

答案 1 :(得分:3)

for(decltype(...))有兴趣的构造你已经在这里提出。

你可能想尝试这个:

for (char& ch : line)
{
    ch = 'X';
}

或者这个:

for(unsigned int i = 0; i < line.size(); i++)
{
    line[i] = 'X';
}

另请注意,'X'"X"之间存在差异: 第一个是char字面值,第二个是字符串文字(这意味着返回类型是const char[2],与const char相对)

答案 2 :(得分:2)

range based for loopauto specifier一起使用(另请参阅this answer):

for (auto& i: line)
   i = 'X';

答案 3 :(得分:1)

然而,另一种方法:

std::for_each(line.begin(), line.end(), [](char& c) { c = 'X'; } );

你甚至可以在这里使用decltype

std::for_each(s.begin(), s.end(), [](decltype(s[0]) c) { c = 'X'; } );

但老实说,对于简单的事情,只需使用简单的循环

答案 4 :(得分:1)

首先搜索已经完成您正在尝试的标准库函数总是好的。在这种情况下,std::string.replace可以解决问题:

#include<iostream>
#include<string>

using namespace std;

int main() {
    string line;
    getline(cin, line);
    line.replace(0, line.size(), line.size(), 'X');
    cout << line << endl;
    return 0;
}