170 похожих чатов

Я работаю над программой на C и у меня есть

функция ContinueOrStop, которая спрашивает у пользователя, хочет ли он продолжить. Функция должна считать один символ из ввода (0, Y, 1 или N). Однако я столкнулся с проблемой: после ввода пользователем функция, похоже, "зависает" или ожидает дополнительный ввод.


#include <stdio.h>

#include <stdlib.h>
void getInput(double *a,double *b);
void output(int a,int b );
void ContinueOrStop(char *yesOrNo);

int main(void) {
char YesOrNo = '0';
double a,b;
do {
getInput(&a,&b);
output(a,b);
ContinueOrStop(&YesOrNo);

}while(YesOrNo != '1');



return 0;
}





void getInput(double *a,double *b){
char YoN;
char *text;
double result;
char n1[256],n2[256];
do{
printf("Enter the number (integer) from which the interval will start:");
fgets(n1,sizeof n1,stdin);

result = strtod(n1,&text);

if (*text != '\n' && result != '\0'){
printf("You entered invalid input.||\tYou enter:%1.0lf in decimals||\tAnd enetered symbol: %s",result,text);
printf("Whoud you like to continiue with decimal numbers you entered and cut off symbols?\nOr you would like to enter new number\n");
printf("Enter 0 to enter new number || Enter 1 to keep suggested number:");
fgets(&YoN,sizeof YoN+1,stdin);
while(getchar() != '\n');
if (YoN == '1'){
*a = result;
break;
}
}else if (*text != '\n') {
printf("You entered invalid input\nYou entered symbols: %s",text);
} else {
*a = result;
break;
}

}while(1);

do{
printf("Enter the number (integer) from which the interval will start:");
fgets(n2,sizeof n2,stdin);

result = strtod(n2,&text);

if (*text != '\n' && result != '\0'){
printf("You entered invalid input.||\tYou enter:%1.0lf in decimals||\tAnd enetered symbol: %s",result,text);
printf("Whoud you like to continiue with decimal numbers you entered and cut off symbols?\nOr you would like to enter new number\n");
printf("Enter 0 to enter new number || Enter 1 to keep suggested number:");
fgets(&YoN,sizeof YoN+1,stdin);
while(getchar() != '\n');
if (YoN == '1'){
*b = result;
break;
}
}else if (*text != '\n') {
printf("You entered invalid input\nYou entered symbols: %s",text);
} else {
*b = result;
break;
}

}while(1);

}

void ContinueOrStop(char *yesOrNo) {
printf("Do you want to continue?\nYes- enter 0 or Y, No - Enter 1 or N:");

while(getchar() != '\n'); // <--- Добавленная строка, чтобы очистить буфер

while(scanf("%c",yesOrNo) != 1) {
while(getchar() != '\n');
printf("Inavalid input.Please enter new number:");
}

if (*yesOrNo == '1' || *yesOrNo == 'N'|| *yesOrNo == 'n'){
*yesOrNo = '1';
}
}

void output(int a,int b){
int i;
if (a < b) {
for (i = a;i <= b; i++){
if (i % 2 == 0){
printf("%d\t",i);
}
}
printf("\n");
} else if (a > b){
for (i = a;i >= b; i--){
if (i % 2 == 0){
printf("%d\t",i);
}
}
printf("\n");
}

}

6 ответов

97 просмотров

Отладчик, supapro и в путь

Женя- Автор вопроса

В @supapro, да и туда лучше такое не постить, есть pastebin

while(getchar() != '\n'); - не очищает буфер, если в нем ничего нет, а ждет, пока пользователь введет \n

Женя- Автор вопроса
Женя
убрал, начало работать

Оно в общем-то и так работало, просто не так, как вы ожидали. Нужно было просто дважды ввести, или первый ввод ограничить только переводом строки

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Раз начали говорить про embassy, то присоединюсь со своими парой вопросов. 1) Есть ли сопоставимые аналоги для асинхронного кода в emdebbed? 2) Можно ли внутри задач embassy ...
NI_isx
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта