оператор if с условием char в C

#c

#c

Вопрос:

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

     repeat: 
    pr=0;
    q=0;
    res=0;
    printf("nEnter the serial number of product you wish to purchase: ");
    scanf("%d",amp;pr);
    printf("Quantity: ");
    scanf("%d",amp;q);
    billing(pr,q);
    printf("Continue Shopping? (y/n) ");
    scanf("%d",amp;res);
    if(res=='y')
    goto repeat;
    else
    return 0;
}
  

Проблема заключается в том, что ввод y выполняет оператор else. Я попытался заменить y на 1,2,3 …. и это работает, но я хочу, чтобы он работал с Y или y или yes .

Комментарии:

1. Просто введите 121 scanf() после printf("Continue Shopping? (y/n) "); .

2. Пожалуйста, не злоупотребляйте goto оператором

3. scanf(«%c»,amp;res);

4. @arun483: Что за маньяк учит о goto before for или [do] while ?

5. @OrkhanAlikhanov scanf(" %c",amp;res); с пробелом в противном случае будет считываться newline оставшееся в буфере.

Ответ №1:

В этой строке ошибка

 scanf("%d",amp;res);
  

Это должно быть

 scanf(" %c",amp;res);
  

Заполнители форматирования для символа %c не %d

Комментарии:

1. для этого я также должен определить «char res;» ?

2. @arun483 Лучше всегда явно определять свои переменные в нужном вам типе.

3. Да, вы должны.

4. Пожалуйста, поставьте a space перед форматом %c , так как scanf(" %c",amp;res); в противном случае этот ответ будет считывать newline то, что все еще было в буфере. Исправлена одна ошибка, но введена другая.

5. Кроме того, res должно быть a char . Этот ответ не будет работать, если OP объявлен res как int .

Ответ №2:

 scanf("%d",amp;res);
  

должно быть

 scanf(" %c",amp;res);
  

Как предложено несколькими пользователями, do while следует использовать поверх goto, поэтому лучший код будет

     do{
    pr=0;
    q=0;
    printf("nEnter the serial number of product you wish to purchase: ");
    scanf("%d",amp;pr);
    printf("Quantity: ");
    scanf("%d",amp;q);
    billing(pr,q);
    printf("Continue Shopping? (y/n) ");
    scanf(" %c",amp;res);
    }
    while(*res == 'Y' || *res == 'y');
    return 0;
}
  

Также должен быть объявлен res char res;

Комментарии:

1. Даунвотер действительно должен был объяснить свой даунвотер. Это неверно : while(*res == 'Y' || *res == 'y'); . Предполагается res , что оно объявлено так, как char res; и должно быть while(res == 'Y' || res == 'y'); . (Нет * перед res ).

2. На самом деле вы ничего не добавляете, выбирая do … во время перехода. Это все еще структурированная программа. Goto разрушает структуру только при переходе в блок или из него.

3. В этом случае do..while блок полностью оправдан. Особенно в сочетании с правильным отступом, это сделает более очевидным, какая часть кода зацикливается, и легко увидеть, какое условие используется для продолжения цикла.

4. @MalcolmMcLean Он добавляет лучшую практику. Я не из тех бешеных людей, выступающих против goto; Я думаю goto , что имеет свое место, и когда это подходящий механизм управления, его следует использовать. Но его никогда не следует выбирать в качестве механизма цикла, если для этого нет веской причины, и за мой 30-летний опыт программирования я видел ровно один такой алгоритм. Это редкий день, когда замена a do , while или for с goto имеет смысл.