После сохранения символа Y (ввода от пользователя для зацикливания) в моей переменной условия, мой цикл while все еще не выполняется?

#c #while-loop #char

#c #цикл while #символ

Вопрос:

Я должен создать цикл while без обновления (процесс или —), как показано ниже. Однако после сохранения ответа от пользователя (Y) в переменной ans цикл не выполняется.

 #include <stdio.h>

void main ()
{
    float volt, ohms, power;
    char ans;
    
    printf ("Enter 'Y' to continue : ");
    scanf ("%c", amp;ans);
    
    while (ans=="Y" || ans=="y");
    { 
        printf ("nEnter the voltage value (Volt)      : ");
        scanf ("%f", amp;volt);
        printf ("Enter the resistance value (Ohms)   : ");
        scanf ("%f", amp;ohms);
    
        power = (volt*volt)/ohms ; 

        printf ("nVoltage    : %.2f nResistance : %.2f nPower      : %.2f", volt, ohms, power);
    
        fflush(stdin);
        printf ("nnEnter 'Y' to continue : ");
        scanf ("%c", amp;ans);
    }
}
 

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

1. Рассматривали ли вы возможность распечатки символа, который был прочитан ans ? Вы также захотите проверить возвращаемое значение scanf . Он должен быть равен 1 , что показывает, что он обработал один ввод, ваш "%c" .

2. Когда я запускаю программу, да, в ней указано, что возвращаемое значение равно 1. Но когда I printf символ ans возвращаемого значения равен 89.

3. Да, значение ASCII ‘Y» равно 89 в десятичной системе счисления. Вы хотели бы использовать %c форматировщик printf, чтобы вывести его как Y .

4. не ставьте эту точку с запятой while (ans=="Y" || ans=="y"); <— этот.

Ответ №1:

Я только что поймал это. Это синтаксическая ошибка. Ну, пара.

Вы написали

 while (ans=="Y" || ans=="y");
 

Видите ; в конце? Это означает, что цикл while выполняет пустой оператор вместо блока в следующей строке.

Если бы вы создали это с включенными полными предупреждениями и современным компилятором, вы бы получили предупреждение о пустом цикле.

Также видите, что вы пытаетесь сравнить один символ char ans со строковым литералом "Y" , который является массивом, а не символом. Вам нужно написать:

 while (ans == 'Y' || ans == 'y')
 

Моя версия GCC 9.3.0 делает это, когда я использую флаги полного предупреждения gcc -W -Wall -pedantic :

 c-scanf-test.c: In function ‘main’:
c-scanf-test.c:10:14: warning: comparison between pointer and integer
   10 |   while (ans == "Y" || ans == "y");
      |              ^~
c-scanf-test.c:10:14: warning: comparison with string literal results in unspecified behavior [-Waddress]
c-scanf-test.c:10:28: warning: comparison between pointer and integer
   10 |   while (ans == "Y" || ans == "y");
      |                            ^~
c-scanf-test.c:10:28: warning: comparison with string literal results in unspecified behavior [-Waddress]
c-scanf-test.c:10:3: warning: this ‘while’ clause does not guard... [-Wmisleading-indentation]
   10 |   while (ans == "Y" || ans == "y");
      |   ^~~~~
c-scanf-test.c:11:3: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ‘while11 |   {
      |   ^
c-scanf-test.c:8:3: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
    8 |   scanf("%c", amp;ans);
      |   ^~~~~~~~~~~~~~~~~
c-scanf-test.c:13:5: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
   13 |     scanf("%f", amp;volt);
      |     ^~~~~~~~~~~~~~~~~~
c-scanf-test.c:15:5: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
   15 |     scanf("%f", amp;ohms);
      |     ^~~~~~~~~~~~~~~~~~
c-scanf-test.c:24:5: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
   24 |     scanf("%c", amp;ans);
      |     ^~~~~~~~~~~~~~~~~
 

Вы можете видеть, что вам нужно исправить много других ошибок.