2014-10-26 5 views
0

Проблема, с которой я столкнулась, может быть чем-то с кодовыми блоками, но я просто хочу дважды проверить и посмотреть, видит ли кто-нибудь проблему с моим кодом. Я уже думаю, что это как-то связано с циклом while. Я продолжаю получать ошибку «Main.exe перестала работать». Мне лично сложно выбирать между опциями, поэтому я пытаюсь сделать быструю и грязную программу на C++, чтобы выбрать случайную опцию между несколькими заданными параметрами. Вот мой код:Скорбь с очень простым кодом

#include <iostream> 
#include <string> 
#include <ctime> 
#include <cstdlib> 

using namespace std; 

int main() 
{ 

cout << "Enter Options to choose between." << endl << endl; 

int i; 
string option; 

do { 

    cin >> option[i]; 

    i++; 
} 
while (cin != "done"); 

cout << option[ rand() %i ]; 

} 
+0

В вашем уме, что такое 'option [i]'? –

+0

Ну 'cin >> option [i]' неверно, так как строка пуста и 'i' не инициализирована. Что именно ты пытаешься сделать? –

+0

'i' неинициализирован и поэтому по существу является случайным, вероятно, очень большим значением. 'option' - это всего лишь одна строка и изначально пуста. 'option [i]' является символом * ith * 'option', его тип -' char'. Параметр 'cin >> [i]' поэтому считывает один символ и пытается сохранить его в произвольной позиции в пустой строке (следовательно, сбой, попытка записать в какое-то странное место в памяти). Это, вероятно, не то, что вы хотите сделать. Ваш код должен отражать то, что вы на самом деле пытаетесь сделать. Компьютеры точно следуют вашим инструкциям. Код, что вы имеете в виду! –

ответ

1

Эта программа (со встроенными комментариями) должна делать то, что вы хотите.

#include <cstdlib> 
#include <ctime> 
#include <iostream> 
#include <string> 
#include <vector> 

using std::cin; 
using std::cout; 
using std::string; 
using std::vector; 

Я использовал явный список имен, которые я хочу импортировать из std пространства имен, так как я не могу знать, что другие имена определены там (там, вероятно, больше, чем 1000), и мне действительно нужно только эти немногие ,

int main() 
{ 
    std::srand(std::time(NULL)); 

Приведенное выше утверждение инициализирует генератор случайных чисел, так что вы не получите тот же «случайное» число в каждом запуске программы.

cout << "Enter options to choose between, an empty line to finish:\n"; 

Я изменил свой "done" в пустую строку, так как это проще набрать. Кроме того, std::endl здесь не нужен. Вы должны написать "\n", что короче и в большинстве случаев эквивалентно.

vector<string> options; 

Это все варианты, которые были введены до сих пор. Каждый параметр - string, а vector может содержать много элементов, поэтому это много строк.

for (string option; std::getline(cin, option) && option != "";) { 
    options.push_back(option); 
    } 

Этот код читает параметры. Переменная option используется только для чтения параметров. После этого он больше не нужен. Цикл for автоматически ограничивает область действия переменной option, поэтому ее можно использовать только в цикле for.

Я также изменил cin >> option на getline(cin, option), чтобы разрешить варианты, содержащие пробелы.

cout << "You entered the following options:\n"; 
    for (std::size_t i = 0; i < options.size(); i++) { 
    cout << "* " << options[i] << "\n"; 
    } 

    cout << "Your random option is " << options[std::rand() % options.size()] << "\n"; 
} 
+1

Вы можете сделать код намного чище, заменив цикл while циклом for.это позволяет вам указать строку без другого слоя отступа. В нем также четко указано, что этот вариант не должен использоваться вне сферы действия. – stefan

+0

Nice Roland. Это сработало отлично. Я думаю, что я попытаюсь вложить все это в цикл (если я могу это сделать, не нарушая его). Спасибо всем за ответы. – Shane

1

Вы читаете в строках с каждыми КИНАМИ, а не символами, так что ваша строка не то, что вы хотите использовать.

std::vector<std::string> options; 
... 
    string in; 
    cin >> in; 
    options.push_back(in); 

Итак, здесь используйте вектор строк вместо одной строки, затем заполните его строками.