繁体   English   中英

为什么当我输入哨兵值时我的程序会崩溃?

[英]Why does my program crash when I enter sentinel value?

我的程序运行基本正常,直到我决定输入哨兵值来停止程序,它显示错误“在项目 4.exe 中的 0x00B474AD 处抛出异常:0xC0000005:访问冲突写入位置 0x00B52FF9。

如果有这个异常的处理程序,程序可以安全地继续。”我试图找出导致这个错误的原因,是否该行被初始化为 0 所以它总是正确的?

这是代码

#include<iostream>
#include<string>
#include <iomanip>
using namespace std;

#include "C:\Users\barta\OneDrive\Documents\Visual Studio 2015\Projects\Project 4\Project 4\array.h"

void displayPlane(char msg[], char[ROW][COL]);
void getData(int &, char &);

int main()
{
    int row = 0;
    char seat;

    while (row != -1)
    {

        displayPlane("\tChesapeaake Airlines", layout);
        cout << endl;
        getData(row, seat);
        cout << endl;
        int COL = seat - 'A';
        if (layout[row - 1][COL] == 'X')
        {
            cout << "Sorry this seat is take" << endl;
        }
        else
        {
            layout[row - 1][COL] = 'X';
        }

    }

    cout << "Have a nice day! " << endl;

    system("pause");
    return 0;
}
void displayPlane(char msg[] , char[ROW][COL])
{
    cout <<msg << endl;
    for (int r = 0; r < ROW; r++)
    { cout << endl;
    cout << setw(4) << r + 1;
        for (int c = 0; c < COL; c++)
        {
            cout << setw(4) << layout[r][c];
        }
    }
}
void getData(int& row, char& seat)
{

    cout << "Enter row <-1 to stop>  ";
    cin >> row;
    cout << "Enter your prefered seat  ";
    cin >> seat;
    seat = toupper(seat);
}

这是头文件

//arrays for airline problem

const int ROW = 9;
const int COL = 4;
const int CTR = 3;

//initial seats in the plane
    char layout[ROW][COL] = {  { 'A', 'B', 'C', 'D' },
                            { 'A', 'B', 'C', 'D' },
                            { 'A', 'B', 'C', 'D' },
                            { 'A', 'B', 'C', 'D' },
                            { 'A', 'B', 'C', 'D' },
                            { 'A', 'B', 'C', 'D' },
                            { 'A', 'B', 'C', 'D' },
                            { 'A', 'B', 'C', 'D' },
                            { 'A', 'B', 'C', 'D' }};

    int classCtr[CTR] = {0,0,0};

    string classes[] = {"First Class", "Business Class", "Coach"};

    double fare [] = {500, 300, 100};

尽管您已确定 -1 为您的哨兵值,并且您甚至还好心地打印了以下信息:

cout << "Enter row <-1 to stop>  ";
cin >> row;

你还没有告诉程序 -1 有什么特别之处。

所以,row 现在等于 -1。 节目继续。

cout << "Enter your prefered seat  ";
cin >> seat;
seat = toupper(seat);

然后我们回到main。 同样,您没有告诉程序担心 row 的值,即 -1。 所以现在你执行:

    cout << endl;
    int COL = seat - 'A';
    if (layout[row - 1][COL] == 'X')

问题:如果row为 -1,您访问layout哪个元素?

如果 -1 是哨兵值,则需要编写代码来强制执行此操作; while 条件仅在每次循环迭代开始时进行测试,它不是监督条件。

第一的:

void getData(int& row, char& seat)
{
    cout << "Enter row <-1 to stop>  ";
    cin >> row;
    if (row == -1)
        return;
    cout << "Enter your prefered seat  ";
    cin >> seat;
    seat = toupper(seat);
}

其次主要是:

cout << endl;
getData(row, seat);
if (row == -1)
    break;
cout << endl;
int COL = seat - 'A';

就个人而言,我会更改“getData”以返回一个布尔值,指示是否已获取数据,并假设当它返回false ,用户输入了哨兵值 - 这样我就不必导出关于数据之外的知识功能。

bool getData(int& row, char& seat)
{
    cout << "Enter row <-1 to stop>  ";
    cin >> row;
    if (row == -1)
        return false;
    cout << "Enter your preferred seat  ";
    cin >> seat;
    seat = toupper(seat);
    return true;
}

主要是:

cout << endl;
if (getData(row, seat) == false) // or just if (!getData(row, seat))
    break;
cout << endl;
int COL = seat - 'A';

并将while循环更改为

for (;;)  // infinite loop
{
    ...
getData(row, seat);
cout << endl;
int COL = seat - 'A';
if (layout[row - 1][COL] == 'X')

如果您输入 -1,则您正在访问

layout[-2]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM