Я столкнулся с этой проблемой: ошибка проверки времени выполнения # 2 – стек в переменной «check» был поврежден в visual studio 12. Я также пытаюсь это сделать в кодовом блоке, но столкнулся с такой же проблемой. Я запускаю свой код также в ideone.com, он показывает ошибку времени выполнения. ИТ работает для Y, но не работает для N
int main () {
int led=0; int ohm=0; char check; int flag=0; while (led 3){ printf("Enter the number of switch you want to close: \n\n"); printf(" ******************** Press 1 for switch (LED) 1 ********************\n"); printf(" ******************** Press 2 for switch (LED) 2 ********************\n"); printf(" ******************** Press 3 for switch (LED) 3 ********************\n"); printf("Switch: "); scanf("%d", &led); } printf("\n\n"); while (ohm 3){ printf("Enter the resistance of Rheostat: \n\n"); printf(" ******************** Press 1 for 10 ohm resistance ********************\n"); printf(" ******************** Press 2 for 20 ohm resistance ********************\n"); printf(" ******************** Press 3 for 30 ohm resistance ********************\n"); printf("Resistance: "); scanf("%d", &ohm); } while (flag == 0) { //LED-1 if(led== 1 && ohm== 1 ) { printf("LED-1 is blinking 2 times\n"); } if(led== 1 && ohm== 2) { printf("LED-1 is blinking 4 times\n"); } if(led== 1 && ohm== 3 ) { printf("LED-1 is blinking 6 times\n"); } //LED-2 if(led== 2 && ohm== 1 ) { printf("LED-2 is blinking 2 times\n"); } if(led== 2 && ohm== 2 ) { printf("LED-2 is blinking 4 times\n"); } if(led == 2 && ohm == 3) { printf("LED-2 is blinking 6 times\n"); } //LED-3 if(led == 3 && ohm == 1 ) { printf("LED-3 is blinking 2 times\n"); } if(led == 3 && ohm == 2) { printf("LED-3 is blinking 4 times\n"); } if(led == 3 && ohm == 3) { printf("LED-3 is blinking 6 times\n"); } printf("Do you want to continue Yes (Y) or No (N): "); scanf("%s", &check); if(check =='Y' || check =='y') { led = 0; ohm = 0; while (led 3){ printf("Enter the number of switch you want to close on: "); scanf("%d", &led); } while (ohm 3){ printf("Enter the resistance of Rheostat: "); scanf("%d", &ohm); } } if(check=='N' || check=='n') { printf("Thanks for using the program"); flag = 1; } } return 0;
}
В заявлении scanf ("%s", &check);
вы пытаетесь отсканировать строку и наполнить ее символом. Есть несколько способов решить эту проблему:
Быстрое исправление : замените scanf("%s", &check)
с помощью scanf (" %c", &check)
. Обратите внимание на пробел в строке формата: " %c"
, а не только "%c"
. Спецификатор формата %c
не пропускает начальные пробелы, поэтому вы должны включать пробелы перед %c
в вашей строке форматирования, чтобы явно сигнализировать scanf()
что вы хотите пропустить ведущие пробелы. Если вы этого не сделаете, произойдет следующее:
возврат каретки во входном streamе из предыдущей подсказки Enter the resistance of Rheostat:
будет приниматься как входной символ. check
будет назначена \n
.
Оба условия будут терпеть неудачу; check
является ни Y
ни y
, ни N
ни n
.
Выполнение вернется к вершине цикла while для flag
, который все еще равен нулю. Таким образом, вывод о соответствующих значениях ohm
и led
будет отображаться снова, а затем снова появится запрос на check
.
scanf()
снова проверит входной stream, на этот раз прочитав фактический выбор, который вводит пользователь, и сделайте соответствующую вещь.
Включая ведущие пробелы в вашей строке формата, вы избежите этого дублированного вывода.
Лучшее исправление : сбросьте входной буфер после каждого вызова scanf()
. Определить макрос:
#define FLUSH while (getchar() != '\n')
и после каждого вызова scanf()
введите FLUSH;
, Это намного безопаснее.
scanf("%s", &check);
должен быть scanf("%c", &check);
поскольку вы читаете char
не строку.
Проблема в том, что ваша переменная «check» слишком мала.
scanf("%1s", check);
Поскольку вы сохраняете строку (с завершением \ 0), вы должны использовать большую переменную:
char check[2];
Изменить. Но да, scanf («% c», & check) намного лучше, если входной сигнал – только один символ.
Он отлично работает для меня в кодовых блоках …. сбрасывает все данные из буферов, т. Е. После считывания буфера ввода данных сбрасывает входной буфер, т.е. scanf («% d», & led); fflush (STDIN); тем самым он очистит входной буфер после прочтения данных.