Intereting Posts
Как выполнить финиш, а затем другую команду из внутренних команд? Вызов kernel_fpu_begin дважды перед kernel_fpu_end Почему мой антивирус называет этот кусок кода вирусом? Что такое тип указателя многомерного массива при передаче функции? Какой алгоритм применяется для непрерывного перераспределения небольших fragmentов памяти? Почему Timer1 не рассчитывает на PIC18? Размещение директивы препроцессора внутри строкового литерала? Что происходит, когда вы пишете в память за пределами массива? фатальная ошибка: sys / socket.h: нет такого файла или каталога на 32 бит Как выполнить qsort массив указателей, которые используют структуры? Переполнение буфера функции sprintf? Соглашения об именах типа C, _t или ALLCAPS Язык C: освобождение памяти указателей на структуру Преобразование десятичного в шестнадцатеричное значение C файловые streamи, добавляемые в начале

Ошибка проверки выполнения во время выполнения # 2 – Урон вокруг переменной «проверка» был поврежден

Я столкнулся с этой проблемой: ошибка проверки времени выполнения # 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() что вы хотите пропустить ведущие пробелы. Если вы этого не сделаете, произойдет следующее:

  1. возврат каретки во входном streamе из предыдущей подсказки Enter the resistance of Rheostat: будет приниматься как входной символ. check будет назначена \n .

  2. Оба условия будут терпеть неудачу; check является ни Y ни y , ни N ни n .

  3. Выполнение вернется к вершине цикла while для flag , который все еще равен нулю. Таким образом, вывод о соответствующих значениях ohm и led будет отображаться снова, а затем снова появится запрос на check .

  4. 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); тем самым он очистит входной буфер после прочтения данных.