C ++不能混淆一个词

时间:2015-05-05 20:45:59

标签: c++

我是我的源代码,我只是不能混淆我的话,它给了我任何我不想要的东西。

我没有错误,没有任何警告,但是如果我放了一个例子:papa,它给了我'p a',为什么? 谢谢你的帮助!

#include <iostream>
#include <string>
#include <random>
#include <chrono>

using namespace std;

string melangeLettre(string mot);
int main()
{
    cout << "Saisissez un mot mystere: \n> ";
    string motMystere{};
    cin >> motMystere;

    cout << "Quel est ce mot ? \n";
    string const newMot = melangeLettre(motMystere);
    cout << newMot << endl;

    return {0};
}

string melangeLettre(string mot)
{
    size_t random = chrono::system_clock::now().time_since_epoch().count();
    mt19937 gen{random};
    string newMot{};

    for (unsigned int i{}; i < mot.size(); ++i)
    {
        uniform_int_distribution<> getNbr(0, mot.size());
        newMot.push_back(mot[getNbr(gen)]);
        mot.erase(i, 1);
    }

    return newMot;
}

1 个答案:

答案 0 :(得分:2)

您的代码中存在一些问题。您选择的分布:

uniform_int_distribution<> getNbr(0, mot.size());

会导致数字包括 mot.size()超过字符串结尾。非空字符串中的最后一个字符的索引为mot.size()-1

在此代码中:

newMot.push_back(mot[getNbr(gen)]);
mot.erase(i, 1);

将一个字符复制到新单词,然后从原始单词中删除一个不同的字符(它可能是相同的字符,但只是偶然)。您可能希望删除添加到新单词的相同字符,如:

auto j = getNbr(gen);
newMot.push_back(mot[j]);
mot.erase(j, 1);

您的循环迭代次数太少,因为您要从每个循环中的单词中删除字符。因此,您只需要迭代直到原始单词为空。

这三件事将你的函数循环改为:

while (mot.size() > 0)
{
    uniform_int_distribution<> getNbr(0, mot.size()-1);
    auto j = getNbr(gen);
    newMot.push_back(mot[j]);
    mot.erase(j, 1);
}