2014-10-26 121 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]'是什么? – 2014-10-26 21:37:44

+0

好'cin >>选项[i]'是错误的,因为字符串是空的,'i'是未初始化的。你想做什么_exactly_? – 2014-10-26 21:37:49

+0

'i'是未初始化的,因此基本上是一个随机的,可能非常大的值。 'option'只是一个'string',最初是空的。 'option [i]'是'option'的* ith *字符,其类型是'char'。 'cin >>选项[i]'因此读取单个字符并尝试将其存储在空字符串中的任意位置(因此崩溃;试图写入存储器中的某个奇怪位置)。这可能不是你想要做的。你的代码应该反映你实际想要做的事情。电脑相对精确地遵循您的指示。代码你的意思! – 2014-10-26 22:03:16

回答

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

通过用for循环替换while循环,可以使代码更清晰。这允许你给这个字符串一个没有另一个缩进层的作用域。它也清楚地表明选项不应该在范围之外使用。 – stefan 2014-10-26 22:32:49

+0

不错的罗兰。这工作完美。我想我会尝试把整个东西放在一个循环中(如果我能做到这一点而不会打破它)。感谢所有的答复。 – Shane 2014-10-27 15:32:07

1

你正在阅读与每个cin字符串,而不是字符,所以你的字符串是不是你想要使用的。

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

因此,这里使用一个字符串的矢量而不是单个字符串,然后用字符串填充它。

相关问题