2013-07-29 2 views
0

Я столкнулся с этой проблемой: ошибка проверки времени выполнения # 2 - стек в переменной «проверка» был поврежден в visual studio 12. Я также пытаюсь это сделать в кодовом блоке, но столкнулся с такой же проблемой. Я запускаю свой код также в ideone.com, он показывает ошибку времени выполнения. IT работает для Y, но оленья кожа работает для NОшибка проверки выполнения во время выполнения # 2 - поврежден файл «check»

INT основной() {

int led=0; 
    int ohm=0; 
    char check; 
    int flag=0; 

while (led < 1 || 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 < 1 || 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 < 1 || led > 3){ 
      printf("Enter the number of switch you want to close on: "); 
      scanf("%d", &led); 
      } 

      while (ohm < 1 || 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; 

}

+4

'scanf ("% s ", & check);' Зачем вы загружаете строку в 'char'? [Посмотрите, что такое '' '' '' '' '' '' '' 'и' '' '') (http://msdn.microsoft.com/en-us/library/6ttkkkhh (v = vs.80) .aspx). –

+1

Пожалуйста, просто не беспокойтесь, используя 'scanf'. http://www.c-faq.com/stdio/scanfprobs.html – jamesdlin

ответ

1

В заявлении scanf ("%s", &check); вы пытаетесь отсканировать строку и вставить ее в символ. Есть несколько способов решить эту проблему:

Быстрое исправление: заменить scanf("%s", &check) с scanf (" %c", &check). Обратите внимание на пробелы в строке формата: " %c", а не только "%c". Спецификатор формата %c не пропускает начальные пробелы, поэтому вы должны включать пробелы перед %c в строку формата, чтобы явно сигнализировать scanf(), что вы хотите пропустить ведущие пробелы. Если вы этого не сделаете, то произойдет следующее:

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

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

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

  4. scanf() проверит входной поток снова, на этот раз, прочитав фактический выбор, который вводит пользователь, и выполните соответствующую задачу.

Включая ведущие пробелы в строке форматирования, вы избежите этого дублированного вывода.

Лучшее исправление: сбросить входной буфер после каждого вызова до scanf(). Определение макроса:

#define FLUSH while (getchar() != '\n') 

и после каждого вызова scanf(), типа FLUSH;. Это намного безопаснее.

1

Проблема заключается в том, что переменная "проверить" слишком мал.

scanf("%1s", check); 

Поскольку вы сохраняете строку (с нагрузочным \ 0), вы должны использовать большую переменную:

char check[2]; 

Edit: Но да, зсапЕ ("% с", & чек) далеко лучше, если ввод - только один символ.

+0

-1 уязвим для переполнения. Что, если я наберу «Нет»? –

+0

+1 это лучше. –

+0

Вы не должны и не можете. :) – bkausbk

2

scanf("%s", &check); должно быть scanf("%c", &check); при чтении char не строка.

+0

Прошло много времени с тех пор, как я использовал 'scanf', но я думаю, % c' может закончиться чтением завершающего '\ n' из других вопросов. –

+0

Дело в том, что я использую 'scanf («% c », & check);' он дважды печатает эту строку 'printf (« Вы хотите продолжить Да (Y) или Нет (N): »);' и i не знаю, почему – user2625486

0

его рабочими штрафа для меня в кодовых блоках .... смывать все данные из буфера чтения т.е. после того, как буфер ввода данных промывать входной буфер зсапа т.е. («% d», & привели); fflush (stdin); , он очистит входной буфер после прочтения данных.

Смежные вопросы