#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 ‘while’
11 | {
| ^
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);
| ^~~~~~~~~~~~~~~~~
Вы можете видеть, что вам нужно исправить много других ошибок.