【问题标题】:Why is this 'if' statement looping?为什么这个'if'语句循环?
【发布时间】:2011-12-03 10:46:59
【问题描述】:

大家好,我正在为一个项目编写部分代码,但我被困在一件事上。如果这是一个优秀的程序员在某个时候自己想出来的事情(因为我想成为一个优秀的程序员,使用 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)

【问题讨论】:

  • 整个项目涉及比较调用列表,以查看一个计划是否比另一个更好。你的问题的答案是肯定的,所以如果你不能帮助我理解,但是当我说输入几乎没有触及这个项目的表面时,请相信我。真的,我只是在概念上对为什么会发生这种情况感到困惑。
  • startend 持有什么?
  • start 和 end 是分别包含 'p' 和 's' 的字符串。 c 是一个字符串,包含输入中的一个字符。
  • 您在处理时间输入时弄乱了流操作符。
  • 什么是colon?最好的猜测,你的输入已经结束了,然后所有来自cin 的进一步读取都变成了 noops,因为你从不检查 eof

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


【解决方案1】:

这一行是错误的:

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;

【讨论】:

    【解决方案2】:

    您的第一个问题是“冒号”获取所有“:34”,然后 start_minutes 获取应该是下一小时的 12。但真正的问题是 cin 会在后续调用接收到的流中留下杂乱无章的内容,因此这些调用会跳过要求您提供更多输入,而只是使用剩余的字符。在每次调用后使用 cin.ignore() 作为一个笨拙的补丁来使其工作,但要更加努力地考虑使用更安全的功能重新设计整个事物。

    【讨论】:

    • 是否可以通过将string colon = ":" 切换为char colon = ':' 来解决这个问题?谢谢,顺便说一句,这对我来说意义重大。 -- 其实我就是自己试试看的,不用当宝宝哈哈。
    • 成功了。非常感谢你,我不敢相信我没有仔细看才能看到:-( 从经验中学习对吗?我真的很感谢你的帮助,每个人都支持这个。
    • 通过“让它工作”,我的意思是不断要求你输入,这样你就有机会干净地退出。在将时间输入存储在变量中时,它仍然不会做您认为应该做的事情,但您可以使用老式的方式进行调试。
    • 是的,我将数据类型从字符串转换为字符,现在可以正常工作了。谢谢!
    【解决方案3】:

    问题在于变量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 点左右发现了这个错误并修复了它。感谢大家的帮助!
    【解决方案4】:

    您没有增加 c 变量

    【讨论】:

    • 但是 c 变量在 do 之后的第一行接受输入,这意味着它应该在循环发生时改变。我的问题是它不会让我一次输入超过一行。在输入第二组数字“12:34”后,当我按下回车键时,它就会继续运行,而不是等待“c”等于“s”。
    猜你喜欢
    • 1970-01-01
    • 2019-07-07
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    相关资源
    最近更新 更多