运行时检查失败#2 - s(Microsoft Visual C ++ 2015上的C语言(社区版))

时间:2016-05-19 07:08:07

标签: c visual-c++

我遇到了这个问题:视觉工作室15中的运行时检查失败#2 - S.这发生在我还试图在C语言中使用数组之前。根据我的教科书,下面的代码会发生什么

char myname[20];

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

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

根据教科书,如果我输入我的名字,例如:Tony Stark,问题只会扫描Tony并忽略空白后的所有内容。但是,当我尝试它时,它会出现运行时检查失败#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;
}

一切都还好,直到最后一部分,它问我在哪里预订下一张票,如果我键入Y以外的其他票,它也会出现同样的问题。

2 个答案:

答案 0 :(得分:4)

关于堆栈溢出,你不是很小心。在第二个代码中,您使用:

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

即使你真的只输入一个字符,scanf也会附加一个尾随的\0终止字符,它已经干扰了堆栈上的其他一些数据。当用户输入更长时,就会出现更多灾难。在这种情况下,使用"%c"格式进行扫描。

答案 1 :(得分:1)

你应该做的是你应该扫描字符而不是字符串

执行:

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