2014-10-26 161 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); 

因此,這裏使用一個字符串的矢量而不是單個字符串,然後用字符串填充它。