2014-10-03 84 views
0

我正在嘗試創建一個簡單的投票系統,它可以非常簡單地通過爲每個投票打印一個星號的makeGraph函數進行循環來獲取結果並繪製它們。運行時,需要輸入並運行,直到makeGraph函數運行。它打印出數千個完全未格式化的星號,然後終止「分段錯誤」。循環打印時的分段錯誤

#include <iostream> 
#include <string> 

using namespace std; 

string makeGraph(int val) 
{ 
    int i; 
    for (i = 0; i < val; i++) 
    { 
     cout << "*"; 
    } 
} 

int main() 
{ 
    string title; 
    cout << "Enter a title: \n"; 
    cin >> title; 
    int vote; 
    int vote1, vote2, vote3 = 0; 
    do 
    { 
     cout << "Enter vote option: 1, 2, or 3.\n"; 
     cin >> vote; 
     if (vote == 1) 
     { 
      vote1++; 
     } 
     else if (vote == 2) 
     { 
      vote2++; 
     } 
     else if (vote == 3) 
     { 
      vote3++; 
     } 
    } while(vote != 0); 
    cout << title << "\n"; 
    cout << "Option 1: " << makeGraph(vote1) << "\n"; 
    cout << "Option 2: " << makeGraph(vote2) << "\n"; 
    cout << "Option 3: " << makeGraph(vote3) << "\n"; 
} 
+3

'makeGraph()'打印,但不返回任何東西,但是你使用它的返回值。這是未定義的行爲。 – 2014-10-03 13:00:55

+0

你應該初始化vote1和vote2爲0.當前的代碼只會初始化vote3。 – 2014-10-03 13:05:22

+0

將'-Wall'傳遞給您的編譯器,並修復警告。 – Yakk 2014-10-03 13:37:22

回答

1

你的功能makeGraph說,它會返回一個string

string makeGraph(int val) 

然而,沒有return值。你所要做的就是寫給cout

這意味着,這是不行的

cout << "Option 1: " << makeGraph(vote1) << "\n"; 

因爲功能不傳遞任何字符串值到輸出流。

我建議改變makeGraph函數如下。

string makeGraph (int val) 
{ 
    string graph = ""; 
    for (int i = 0; i < val; ++i) 
    { 
     graph += "*"; // Concatenate to a single string 
    } 
    return graph; 
} 
+0

有沒有一種類型的功能,所以我不必返回任何東西?或者我應該真的只是返回0,並使其爲int函數? – Jordan 2014-10-03 13:02:48

+0

是的,無效的。但是你只應該調用這個函數,不要使用cout。 – 2014-10-03 13:03:47

+0

@Jordan看我的編輯。我只是建議修復這個函數本身,其餘的代碼應該沒問題。 – CoryKramer 2014-10-03 13:04:48