Код в C++ не примет нет и остановит программу

Я пробовал много вещей, и я не могу понять, почему эта программа не остановит код, если вы выберете N, когда она предложит повторить попытку или нет.

Я чувствую, как будто у меня это работало ранее, но я не могу найти код, когда он работал, и я не вижу причин, по которым это не должно работать. Кто-нибудь может помочь?

#include <iostream>
using namespace std;

int main ()
{
    char color[10];
    char reboot, yes_no;

    start:
        cout << "What color is the light?\n";
        cin >> color; 

    //if the light is Green
    if (!strcmp(color, "green")) { 
        cout << "The light is Green, you may go ahead and drive thru the intersection.\n"; 
    } else if (!strcmp(color, "Green")) { 
        cout << "The light is Green, you may go ahead and drive thru the intersection.\n"; 

        //if the light is Yellow
    } else if (!strcmp(color, "yellow")) { 
        cout << "The light is Yellow, safely stop at the intersection, or proceed thru.\n"; 
    } else if (!strcmp(color, "Yellow")) { 
        cout << "The light is Yellow, safely stop at the intersection, or proceed thru.\n"; 

        //if the light is Red
    } else if (!strcmp(color, "red")) { 
        cout << "The light is Red, you need to stop.\n"; 
    } else if (!strcmp(color, "Red")) { 
        cout << "The light is Red, you need to stop.\n"; 
    } 

    //non recognised input
    else{
        cout << "\nYour input was not recognised...Would you like to restart? (Y/N)\n";
        cin >> yes_no;
        if(yes_no == 'Y'||'y'){
            goto start;
        }
    }

    //restart program
    restart:
        cout << "\nWould you like to run the program again? (Y/N)\n";
        cin >> reboot;
        if(reboot == 'Y'||'y'){
            goto start;
        }
    return 0;
}

3 ответа

Решение

Ваше состояние не очень хорошее, оно должно быть

if( (reboot == 'Y') || (reboot ==  'y') )
{
    goto start;
}

Как таковой, он всегда оценивается как истина, так как "у" оценивается как истина и true || anything всегда дает правду.

То же самое относится и к yes_no проверять.

РЕДАКТИРОВАТЬ Так как у вас возникли проблемы, я сделал простую программу для более удобного тестирования, это должно работать как ожидалось:

#include <iostream>

using namespace std;

int main()
{
    char yes_no;

    while (true)
    {
        cout << "Enter 'N or 'n' to quit\n";
        cin >> yes_no; 

        if(yes_no == 'N'|| yes_no == 'n')
            break;
    }
    return 0;
}

Начиная с реальной причины, по которой ваш код не работает - приоритет оператора и ассоциативность:

reboot == 'Y'||'y'

всегда возвращается trueразобрано как (reboot=='Y')||'y', Если вы хотите проверить, если reboot равен одному из двух символов, проверьте это так: reboot=='Y'||reboot=='y',

Это должно исправить ваш код. Хотя вот несколько советов:

  • Не используйте goto заявление. Вы можете зациклить свой код, используя циклы (while, for или же do while).
  • Если вы используете C++использовать std::string для хранения текста вы можете использовать text=="some Text" вместо того, чтобы проверить вывод strcmp,
  • Для дальнейшего ознакомления с приоритетом оператора вы всегда можете проверить Википедию.

Эти 2 строки выглядят немного странно

if(yes_no == 'Y'||'y') 
if(reboot == 'Y'||'y')

может ты имел ввиду ниже вместо??

if(yes_no == 'Y' || yes_no == 'y')
if(reboot == 'Y' || reboot == 'y')
Другие вопросы по тегам