2016-11-04 2 views
0

Привет, коллеги-программисты, мне было задано домашнее задание написать код, который берет строку, введенную пользователем, который затем выбирает, как манипулировать строкой и в некоторых случаях печатать ее на консоли. У меня есть код, в основном написанный и работающий, но есть несколько функций, которые я не понимаю, как писать.String Manipulation - Jumble Strings C++

Один из вариантов должен взять строку и показать «смешавшуюся версию» строки без ее фактического изменения. (Например, «Hello World!» Становится «oleWrl! OdlH» или любое другое случайное изменение каждый раз, когда выбирается опция.)

Это функция у меня есть сейчас, и был не принят моим профессором, потому что он изменяет оригинальная строка.

std::string jumbleString(string str2) { //jumble 
    string str = str2; 
    random_shuffle(str.begin(), str.end()); 

    return str; 
} 

Что такое альтернативный способ Я могу перепутать/перетасовать и напечатать строку, чтобы получить те же результаты?

изменения: Добавлен актуальный вопрос

Я извиняюсь за любые нарушения форматирования, это мой первый раз здесь размещения. Спасибо за любую помощь. :) Это задание меня заводит.

+4

Нет это не меняет оригинал. Ваш профессор очень плохо формулирует, что они хотят, чтобы вы использовали какую-то форму цикла. Твой путь - это то, как большинство программистов под управлением C++ подходят к программе, поэтому в этом есть комфорт. – StoryTeller

+1

Что сказал @StoryTeller, это очень верно. Использование стандартных алгоритмов библиотеки для замены ручных кодов обычно очень приветствуется в современном коде C++. –

+1

Сказав выше ... Это сайт Q & A, и ваше сообщение на самом деле не содержит вопроса. – StoryTeller

ответ

0

Ну, что вам нужно, чтобы отобразить каждый символ в новой позиции ... поэтому сопоставить каждое исходное положение в новое положение:

using size_type = std::string::size_type; 

std::vector<size_type> pos(str2.length()); 
size_type n = 0; 
std::generate(begin(pos), end(pos), [&]{ return n++; }); 
std::shuffle(begin(pos), end(pos), std::rand); 
for (auto i : pos) 
    std::cout << str2[i]; 
+0

Это очень полезно, спасибо. Именно поэтому я понимаю, что это делает; он просто берет каждого из символов в строке и переназначает его на новую позицию, правильно? –

+0

Yup. А затем распечатывает символ по характеру. – user4581301

+0

Спасибо, очень ценится. –