为什么这个'if'语句循环?

时间:2011-10-08 05:50:29

标签: c++ loops if-statement while-loop do-while

嘿伙计们,我正在编写一个项目代码的一部分而且我只是坚持一件事。如果这是好的编码员在某些时候自己想出的东西(因为我想成为一个好的,第五周用c ++;到目前为止那么好......)和它的试验,说出这个词和我'螺旋,但我已经调试了大约半小时,不明白为什么我的'if'语句循环。

输入应如下所示:

  

p 11:34 12:45

其中p表示你是否已经完成(如果你想让它出来,那就是's',在这里用'end'表示。)

const int LIST_SPACE = 1000; // this is outside of the main function
string c;                    // and is 1000 because of a parameter set by the teacher
string end = "s";
string start = "p";
int temp_start_hour;
int temp_start_min;
int temp_end_hour;
int temp_end_min;

string colon = ":";
int begin_hours[LIST_SPACE];
int begin_min[LIST_SPACE];
int end_hours[LIST_SPACE];
int end_min[LIST_SPACE];
int i = 0;
do {
    cin >> c; //where c is a string

    if(c != start && c != end)
    {
        cout << "ERROR IN INPUT";
        return 1;
    }

    if(c != end)
    {
        cin >> temp_start_hour >> colon >> temp_start_min;
        cin >> temp_end_hour >> colon >> temp_end_min;
        begin_hours[i] = temp_start_hour;
        begin_min[i] = temp_start_min;
        end_hours[i] = temp_end_hour;
        end_min[i] = temp_end_min;
        cout << begin_hours[i]; //I did this to check if it was storing values
        i++;
    }
 }while(c != end); //ending the do-while loop

我真的很感激与这些家伙一起朝着正确的方向努力。或者总体上就我缺少的概念提出建议。谢谢!

顺便说一下,我一直得到的输出是:(这是输入'p 11:34 12:34')

11111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111Segmentation fault (core dumped)

4 个答案:

答案 0 :(得分:3)

这一行错了:

cin >> temp_start_hour >> colon >> temp_start_min;

含义:读取一个int,然后读取一个字符串,最后读取另一个int。根本不读取变量colon的值。

您可以尝试以下代码来查看其行为:

string sep = ":";
int a, b;

cin >> a >> sep >> b;

cout << a << endl;
cout << sep << endl;
cout << b << endl;

答案 1 :(得分:1)

你的第一个问题是'冒号'得到了全部的“:34”,然后start_minutes获得了本应该是下一个小时的12。但真正的问题是,cin会在随后的调用中拾取的流上留下残余,所以这些调用会跳过请求您输入更多内容并且只剩下字符。在每次调用之后使用cin.ignore()作为一个kludgy补丁来使它工作,但是想想用更安全的函数重新设计整个事件会更加困难。

答案 2 :(得分:0)

问题在于变量colon的类型。修复非常简单:只需将colon的类型从string更改为char

//string colon = ":"; //commenting out the old code
char colon; //new code : no need to initialize it

为什么string colon会导致问题,因为当类型为string时,cin会读取从':'开始到字符的所有字符,直到遇到空格,实际上,您打算只读取一个名为':'字符。对于此,正确的数据类型为char(或者您也可以选择unsigned char)。

答案 3 :(得分:-1)

您没有递增c变量