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 ответов

103 просмотра

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

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

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

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

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

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта