2014-10-03 78 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