2015-05-06 2 views
-3

Я просто не могу смешать свое слово, это дает мне все, что я не хочу. У меня нет никаких ошибок, никаких предупреждений, но Whe я помещал строку я StD :: out_of_rangeКак смешивать слово? C++

#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()); 
     int const alea{mot[getNbr(gen)]}; 

     newMot.push_back(alea); 
     mot.erase(alea, 1); 
    } 

    return newMot; 
} 

Проблема заключается в функции «» melangeLettre, пожалуйста, кто-то может помочь мне решить эту проблему?

+1

Если вы хотите, чтобы зашифровать строку, вы должны использовать [ 'станд :: random_suffle()'] (http://en.cppreference.com/w/ cpp/algorithm/random_shuffle) – NathanOliver

+0

Да в алгоритме include, но я не хочу использовать готовую функцию. – user3813238

+0

Итак, какие результаты * * вы получаете, если не ошибки или предупреждения? Строки не перетасовываются? Они возвращаются пустым или дублируются? –

ответ

1

Вы используете значение символа своей случайной буквы в качестве индекса для символа, который хотите стереть. Я думаю, вам нужно оставить заметку о вашей случайной позиции getNbr(gen) и использовать ее как символ для erase().

Также ваш цикл for() не будет работать, потому что размер вашего слова mot продолжает меняться.

И наконец, ваше целочисленное распределение - включительно.

Это с вышеуказанными поправками:

#include <random> 
#include <chrono> 
#include <iostream> // need this 

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) 
    while(!mot.empty()) // mot keeps changing size so use this 
    { 
//  uniform_int_distribution<> getNbr(0, mot.size()); 
     uniform_int_distribution<> getNbr(0, mot.size() - 1); // range inclusive! 

     auto pos {getNbr(gen)}; // store the position of the letter 
     auto alea {mot[pos]}; 

     newMot.push_back(alea); 
     mot.erase(pos, 1); // erase the letter from the stored position 
    } 

    return newMot; 
} 
+0

О да, проблема была в цикле for! Спасибо тебе так много :) – user3813238

Смежные вопросы