c的航班预订系统

时间:2016-10-15 20:18:00

标签: c arrays visual-studio-2015 switch-statement structure

我正在尝试创建一个航空公司预订系统,它可以预订机票,显示预订机票,并取消机票。我已经使用数组结构编写了代码。现在代码只执行保留票并退出。

但是当我按1保留票时,它接受该选项,但在ConsoleApplication1.exe中出现错误“在0x0FFAFBB3(ucrtbased.dll)处抛出异常:0xC0000005:访问冲突写入位置0x0004B000。”

代码说明如下。任何人都可以识别代码中的错误区域。

#include <stdio.h> 
#include <conio.h> 
#include <stdlib.h>
#include <string.h>

void initialize();
void reserve(); 

struct passengers {

char* firstname;    
char* surname;
char* passport;
};

passengers passenger[10]; 


void initialize()
{
for (int a = 0; a < 10; a++) {

    passenger[a].passport = "";
    passenger[a].firstname = "";
    passenger[a].surname = "";

 }

 }
 void pause()
 {
printf("\n");
system("pause");
system("cls");
}


int main()  {

int seat = 0;

initialize();

int choice;

do {
    system("cls");
    printf("\n\n\t\t*************************************\n\n");
    printf("\t  *****Welcome To airline reservation system*****\n\n"); 
    printf("\t\t\t   ******************");
    printf("\n\n\t\t  1. RESERVE SEAT");
    printf("\n\n\t\t  2. CANCEL SEAT");
    printf("\n\n\t\t  3. DISPLAY SEAT LAYOUT");
    printf("\n\n\t\t  4. EXIT SYSTEM");
    scanf_s("%d", &choice); fflush(stdin);


    switch (choice) {

    case 1: reserve();
        break;
    case 2: cancel();
        break;
    case 3: display();
        break;
    case 4: exit(0);
        break;
    default:
        printf("\nInvalid Choice");
    }

 } while (choice != 4);



_getch(); 

 }


 void reserve()   
{
int seat = 0;
passenger[seat].firstname = (char*)malloc(15);
passenger[seat].surname = (char*)malloc(15);
passenger[seat].passport = (char*)malloc(9);

for (int a = 0; a < 10; a++)   
{

    if (passenger[a].passport == "")
    {
        seat = a; 
        break;
    }


}

if (seat < 10)
{
    printf("\n\t\t Enter First Name:");
    scanf_s("%s", passenger[seat].firstname);

    printf("\n\t\t Enter Surname:");
    scanf_s("%s", passenger[seat].surname);

    printf("\n\t\t Enter Passport Number:");
    scanf_s("%s", passenger[seat].passport);


}
else {

    printf("\n\t\t Sorry, No seats are available");


}

pause();

}

2 个答案:

答案 0 :(得分:0)

你有很多问题,这些应该有所帮助。但您可能需要解决其他人强调的问题:

  1. scanf_s应该传递%s的大小参数,你正在使用它,就好像你使用的是scanf而不是scanf_s,请看这里:https://msdn.microsoft.com/en-us/library/w40768et.aspx

  2. 您没有使用malloc()或其他方法为字符串分配空间。因此,当scanf_s将尝试写入输入的值时,它将踩踏变量所指向的任何内容。我认为这是不可写的记忆。

  3. 您指的是结构中指针字段的地址,而不是将内存分配给该指针并在该指针字段中传递值:

    • 分配: 乘客[座位] .firstname =(字符*)malloc的(MAX_FIRSTNAME_SIZE);

    • 变化: &#39;&安培;乘客[座位] .firstname&#39;乘客[座位] .firstname&#39;

  4. 另外(原谅我,如果我弄错了)它看起来像一个术语结束项目或测试问题。无论这个建议多么不受欢迎:我建议你查看一些关于设置断点和使用visual studio调试器的文档。即使只是在调试模式下运行项目,也会将您带到发生错误的位置。如果您在测试中需要这样做,这将有助于您更好地学习技能并节省宝贵的时间。

    希望它有所帮助。

答案 1 :(得分:0)

您定义了一个乘客[10]数组,因此该数组的有效索引是0..9。但是,initialize()函数中的for循环也尝试使用索引10(a&lt; = 10)进行初始化,这超出了数组的末尾,这将破坏内存。同样,在你的reserve()函数中,你的for循环条件是错误的,你有'a&gt; = 10',我认为你的意思是使用'a&lt; 10' 。