【问题标题】:Attempting to create a queue - issue with crashing C++尝试创建队列 - C++ 崩溃问题
【发布时间】:2013-09-18 23:26:40
【问题描述】:

对于我的数据结构课程,我必须创建一个从 .dat 文件中获取输入的队列,并根据高优先级(仅当它为 1)和低优先级(2 3 4 或 5)来组织它。必须有两个队列,* 表示要服务(或删除)多少。 .dat 文件如下所示:

R 3
T 5
W 1
A 4
* 3
M 5
B 1
E 1
F 2
C 4
H 2
J 1
* 4
* 1
D 3
L 1
G 5
* 9
=

这是 main.cpp

int main ()
{
    arrayQueue myHigh; //creates object of arrayQueue 
    arrayQueue myLow; //creates another object of arrayQueue


    while(previousLine != "=") //gets all the lines of file, ends program when it gets the line "="
    {
        getline(datfile, StringToChar);  
        if (StringToChar != previousLine)
        {
            previousLine=StringToChar; //sets previousline equal to a string
            number = StringToChar[2]; //the number of the data is the third line in the string
            istringstream ( number ) >> number1; //converts the string to int
            character = StringToChar[0]; //the character is the first line in the string            

        }

        if (number1 == 1) //if number is 1, sends to high priority queue
        myHigh.addToQueue(number1);          
        else if (number1 == 2 || number1 == 3 || number1 == 4 || number1 == 5) //if number is 2 3 4 or 5 sends to low priority queue
        myLow.addToQueue(number1);

    }
    datfile.close();
    system ("pause");
}

这是数组类:

void arrayQueue::addToQueue(int x)
{
     if (full() == true)
     cout << "Error, queue full \n";
     else {
     fill = (fill+1)%maxSize;
     queueArray[fill] = x;
     cout << x << endl; //testing that number is actually being passed through
     count++;
     size++;
     }
}

但是,我得到的输出只是:

3
5

然后它没有错误地崩溃。

我不确定我应该去哪里,我之前没有在 C++ 中创建过一个类的两个对象或使用一个文件来读取数据。我做对了吗?我认为它只是将 3 和 5 送入高优先级队列,即使它不应该这样做。

【问题讨论】:

  • number1 == 2 || 3 || 4 || 5 不会按照你的想法去做。您必须比较每个数字(number1 == 2 || number1 == 3 ... .
  • 谢谢你,我也错过了。它仍然在同一个地方崩溃,不知道会是什么!
  • 它要求相当多的 SO 参与者完成你所有的代码(有很多)。为了让我们更轻松,您需要确保我们可以复制和粘贴并编译它。这是不可能的,因为例如,您遗漏了 arrayQueue 声明。理想情况下,将所有内容复制并粘贴到一个文件中(显然首先是 h 文件),并添加一些额外的 cmets 来说明哪个文件是哪个文件。然后,任何想要提供帮助的人都可以简单地将您的帖子复制并粘贴到他们选择的 IDE 中。 更好的是让您隔离一小部分失败的代码。
  • 另外,将您的代码缩小到您认为问题所在的 sn-ps。您发布的代码太多,难以阅读和理解。
  • 听起来你还没有尝试过使用调试器。您可以在 gdb 中运行并查看堆栈(bt 命令),这可能会对您有所帮助。

标签: c++ arrays queue


【解决方案1】:

因为输出通常是缓冲的,所以在程序崩溃之前您可能看不到所有输出。根据我对您的代码的检查,我希望它在到达输入文件的最后一行时会崩溃,因为 StringToChar 的长度为 1 并且您正在访问 StringToChar [2]。好吧,也许不会崩溃,但肯定会得到垃圾。我不确定字符串是否会引发异常。

【讨论】:

    【解决方案2】:

    您对读取行的处理肯定不太正确。首先,您不会检查是否可以成功读取一行,但应始终检查输入您尝试读取它之后。此外,如果输入是=,您实际上将该值视为普通线。您的基本输入应该如下所示:

    while (std::getline(datFile, StringToChar) && StringToChar != "=") {
        ...
    }
    

    鉴于您的“字符串”number 实际上只包含一个字符,因此创建 std::istringstream(创建这些对象相对昂贵)并将 char 解码转换为 @987654326 有点矫枉过正@。此外,您实际上需要检查此操作是否成功(例如,对于您的最后一行,它会失败)。

    将表示数字的单个char 转换为字符串可以使用以下方法完成:

    if (3 <= StringToChar.size()
        && std::isdigit(static_cast<unsigned char>(StringToChar[2])) {
        number1 = StringToChar[2] - '0';
    }
    else {
        std::cout << "the string '" << StringToChar << "' doesn't have a digit at position 2\n";
        continue;
    }
    

    【讨论】:

      【解决方案3】:

      我认为“adipy”很接近,但是...

      getline(datfile, StringToChar);
      

      首先,您应该检查返回值以确保返回了一个字符串。

      其次,如果我们假设StringToChar 等于=,那么 (StringToChar != previousLine)true

      然后StringToChar[2];

      另外,您可能会尝试输入最后一个 previousLine 两次。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-10
        • 2023-03-06
        • 1970-01-01
        • 2018-06-01
        • 2011-02-20
        • 1970-01-01
        相关资源
        最近更新 更多