【发布时间】:2016-10-15 20:18:00
【问题描述】:
我正在尝试创建一个航空公司预订系统,它应该预订机票,显示预订的机票,并取消机票。我已经使用数组结构编写了代码。目前,代码仅执行预订票并退出。
但是当我按 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();
}
【问题讨论】:
-
首先,我们可以假设您正在使用类似于 C++ 编译器的东西进行编译,因为如果不是,
passengers passenger[10];不应该编译,更不用说链接和运行了。而且您似乎忘记了main()之后的{,这又会阻止编译。关于您的异常,您没有为字符串读取分配空间,因此这样做会调用未定义的行为。 -
passengers passenger[10];应该是struct passengers passenger[10];请重写整个内容。实在是太乱了! -
学习使用调试器自己调试问题。
-
@WhozCraig 我应该如何为其中的字符串分配空间?
-
这段代码有很多个问题,假设已经提到的问题已经修复。字符串比较不正确,
for (int a = 0; a >= 10; a++)没有机会迭代,所以seat将永远是0。为这样的事情制作了一个调试器,看来您拥有最好的调试器之一(Visual Studio 可以说是 Windows 上最好的用户程序调试器;使用它)。
标签: c arrays visual-studio-2015 switch-statement structure