2016-05-19 1 views
1

Я столкнулся с этой проблемой: ошибка проверки времени выполнения # 2 - S в визуальной студии 15. Это случается раньше, когда я также пытаюсь использовать массив на языке C. По моему учебнику, что случилось с ниже кодОшибка проверки времени выполнения # 2 - s (язык C на Microsoft Visual C++ 2015 (версия сообщества))

char myname[20]; 

printf("Type your name:"); 
scanf("%19s", myname); 

printf("\n\n%s,Welcome to the class\n", myname); 

Согласно учебнику, если ввод мое имя, как, например: Тони Старк, проблема будет только сканировать Тони и игнорировать все вещи после того, как пустое пространство. Однако, когда я пытаюсь это сделать, появляется Ошибка проверки времени выполнения # 2.

Также в поле ниже код

#include<stdio.h> 

int main(void) 
{ 
    char name[30]; 
    int seat[30] = { 0 }; 
    int i, seatt, j; 
    char decision[1]; 

    do 
    { 
     printf("Hi, what is your name? "); 
     scanf("%s", name); 

     printf("Welcome %s!\n\n", name); 

     printf("*********************\n"); 
     printf("CINEMA 1 SEATING PLAN\n"); 
     printf("*********************"); 
     for (i = 0; i < 30; i++) 
     { 
      if (i % 5 == 0) 
      { 
       printf("\n\n"); 
      } 
      if (seat[i] == 0) 
      { 
       printf("%3d", i); 
      } 
      else 
      { 
       printf("%3s", "**"); 
      } 
     } 
     printf("\n\n*********************"); 
     do 
     { 
      printf("\n\nWhich seat do you want? "); 
      scanf("%d", &seatt); 
      if (seat[seatt]!=0) 
      { 
       printf("Sorry, seat is taken!\n"); 
       for (j = 0; j < 30; j++) 
       { 
        if (seat[j] == 0) 
        { 
         printf("Suggest to take seat: %d", j); 
         break; 
        } 
       } 
      } 
     } while (seat[seatt] != 0); 
     ++seat[seatt]; 

     printf("\n\nWould you like to make next booking (Y or N)? "); 
     scanf("%s", decision); 
     printf("\n\n"); 
     if (decision[0] == 'Y' || decision[0] == 'y') 
     { 
      system("cls"); 
     } 

    } while (decision[0] == 'Y' || decision[0] == 'y'); 
    printf("See you again!\n"); 

    return 0; 
} 

Все нормально, до тех пор, когда до последней части, где спрашивают меня, где заказать следующий билет, если я keyin другой, кроме Y, она также не появляется та же проблема ,

+0

ли первый фрагмент кода * все * ваш код? А во второй программе, на какую переменную указывает сообщение? – immibis

+0

Первая проблема - это всего лишь небольшая часть кода, потому что я знаю, что в ней происходит ошибка. Для второй проблемы сообщение показывает Run-Time Check Failure № 2 - S, поэтому я предполагаю, что это указывает на переменную S –

+0

Вторая программа не имеет переменной S. – immibis

ответ

4

Вы не очень осторожны в отношении переполнения стека. Во втором коде, вы используете:

char decision[1]; 
scanf("%s", decision); 

scanf добавит заднюю \0 терминации характер уже мешая некоторые другие данные в стеке, даже если вы на самом деле только ввод одного символа. Больше сбоев при входе пользователя больше. Сканирование с форматом "%c" в этом случае.

+0

Вы, вероятно, имеете в виду переполнение буфера. – Lundin

+0

Изначально я фактически использую% c, однако, когда я использую% c, он будет напрямую пропускать сообщение сканирования и перейти к следующему утверждению и положить конец этой проблеме. Оператор сканирования изначально выглядит следующим образом: я попробовал как «scanf («% c », так и решение); и 'scanf ("% c", решение);'. Должна ли быть какая-то проблема с моим комплиментом? –

+0

@TonyNgWeiShyang, потому что вы оставили свисающую новую строку в своем потоке ввода. Используя ''% c "' (обратите внимание на пробел) для вашей строки формата будет потреблять пробелы до следующего не-пробельного символа и, вероятно, сделает то, что вы хотите для одного ввода char. – WhozCraig

1

Что вы должны сделать, это вы должны сканировать характер вместо строки

Do:

char decision[1]; 
scanf("%c", decision); 
Смежные вопросы