2011-10-08 143 views
2

嘿家伙我正在写一个项目的代码的一部分,我坚持一件事。如果这是一些很好的编程人员在某个时刻自己弄清楚的话(因为我希望成为一名优秀的编程人员,第五周使用C++;迄今为止这么好......)以及它的一项试验,说出这个词,但是我一直在调试大约半个小时,不明白为什么我的'if'语句正在循环。为什么这个'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) 
+1

这是一个家庭作业项目吗? – SpeedBirdNine

+0

整个项目涉及比较调用列表以查看一个计划是否比另一个更好。你的问题的答案是肯定的,所以如果你不能帮助我理解,但是当我说投入几乎不能抓住这个项目的表面时,请相信我。真的,我只是在概念上混淆为什么会发生这种情况。 –

+0

什么是“开始”和“结束”? – cnicutar

回答

1

你的第一个问题是,“冒号”获取所有的“34”,然后start_minutes得到12本来应该是下一个小时。但真正的问题在于cin会在后续调用中留下的流中留下垃圾,所以这些调用不会要求您输入更多内容,而只需留下剩下的字符。在每次调用后使用cin.ignore()作为kludgy补丁来使其工作,但认为使用更安全的函数重新设计整个事情会更困难。

+0

这会通过将'string冒号=“:”'切换到'char冒号='来解决:''?顺便说一句,谢谢,这对我来说意义重大。 - 其实,我只是想亲自尝试一下,不需要做个小孩哈哈。 –

+0

这样做。非常感谢你,我不敢相信我看起来没有那么接近:-(从经验中学习到正确吗?我真的很感谢你的帮助,并且每个人都为此付出了努力。 –

+0

通过“make it work”,我的意思是不断要求你输入,所以你有机会退出干净,但它仍然不会做你认为应该把时间输入存储在你的变量中,但你可以用老式的方式进行调试 – kylben

-1

你是不是递增c变量

+0

但是c变量在do之后的第一行接受输入,这意味着它在循环发生时应该改变。我的问题是,它不会让我一次输入多行。只要我在进入第二组数字'12:34'后进入回车,它就会开始,而不是等待'c'等于's'。 –

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; 
0

问题出在变量colon的类型。解决方法是非常简单的:

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

为什么string colon引起问题,因为当类型为stringcin读取':'开始一个字符的所有字符,直到它遇到一个:从stringchar只是改变的colon类型空间,其实你打算读只有一个这个字符叫做':'。对此,正确的数据类型是char(或者您也可以选择unsigned char)。

+0

谢谢,我发现错误在3左右,并修复它。感谢所有的帮助! –