鱼C论坛

 找回密码
 立即注册
查看: 545|回复: 5

[已解决]直接跳出

[复制链接]
发表于 2023-10-28 10:51:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这段代码为什么在输入:
3
1

之后在打印"It in"后直接停止,没有打印出错信息?

main.cpp
#include "all.h"
#define NOT_FOUND -1
#define INVALID_INDEX -2
#define NODE_CREATION_FAILURE -3
#define INVALID_ORDER -4
using namespace std;

struct Node{
        int value = 0;
        Node *nextv = NULL;
};

int length = 0;

Node *pHead = NULL, *pEnd = NULL;

void Create(){
        Node *pNow = NULL;
        
        pNow = (Node *)malloc(sizeof(Node));
        if(pNow == NULL){
                throw NODE_CREATION_FAILURE;
        }
        pNow -> value = 0;
        pNow -> nextv = NULL;
        pHead = pNow;
        
        length++;
}

void add(int index, int value){                // 在第index个节点前插入
        Node *pTN = pHead, *pTn = pHead -> nextv, *pNow = NULL;
        pNow = (Node *)malloc(sizeof(Node));
        if(pNow == NULL){
                throw NODE_CREATION_FAILURE;
        }
        pNow -> value = value;
        pNow -> nextv = NULL;
        if(index < 0){
                throw INVALID_INDEX;
        }
        if(index == 0){
                pNow -> nextv = pHead;
                pHead = pNow;
        }
        index--;
        for(int i = 0;i < index;i++){        // 找到第index个节点
                if(i > length){
                        break;
                }
                pTn = pTn -> nextv;
                pTN = pTN -> nextv;
        }
        pNow -> nextv = pTn;
        pTN -> nextv = pNow;
        length++;
}

int del(int index){
        Node *pTN = pHead, *pTn = pHead -> nextv;
        int r;
        if(index < 0){
                throw INVALID_INDEX;
        }
        if(index == 0){
                pHead = pTN -> nextv;
                r = pTN -> value;
                free(pTN);
                return r;
        }
        index--;
        for(int i = 0;i < index;i++){
                if(i > length){
                        break;
                }
                pTn = pTN;
                pTN = pTN -> nextv;
        }
        r = pTn -> value;
        pTN -> nextv = pTn -> nextv;
        free(pTn);
        length--;
        return r;        
}

int show(int index){
        Node *pTN = pHead;
        for(int i = 0;i < index;i++){
                if(i > length){
                        throw INVALID_INDEX;
                }
                pTN = pTN -> nextv;
        }
        return pTN -> value;
}
int find(int value){
        Node *pTN = pHead;
        int index = 0;
        for(int i = 0;;i++, index++){
                if(pTN -> value == value){
                        return index;
                }
                if(i > length){
                        cout << "NOT FOUND" << endl;
                        throw NOT_FOUND;
                }
                pTN = pTN -> nextv;
        }        
}

void print(){        // 打印链表
        Node *pTN = pHead;
        for(int i = 0;;){
                cout << (pTN -> value) << endl;
                sleep(1);
                if(i > length || pTN -> nextv == NULL){
                        break;
                }
                pTN = pTN -> nextv;
                i++;
        }
}

void printx(){
        Node *pTN = pHead, *pTn = NULL;
        for(int i = 0;;i++){
                cout << (pTN -> value) << endl;
                sleep(1);
                if(i > length || pTN -> nextv == NULL){
                        break;
                }
                pTn = pTN -> nextv;
                free(pTN);
                pTN = pTn;
        }
}

int main(){
        char inu[6];
        int ind, val;
        Create();
        while(1){
                cout << "Please enter a order(1.add node, 2.delete node, 3.find, 4.show, 5.print, 6.length, (e\\q).exit):";
                cin >> inu;
                system("cls");
                try{
                        switch (inu[0]) {
                                case '1':
                                        cout << "Please enter the value:";
                                        cin >> val;
                                        cout << "Please enter the index:";
                                        cin >> ind;
                                        add(ind, val);
                                        break;
                                case '2':
                                        cout << "Please enter the index:";
                                        cin >> ind;
                                        cout << "The value is " << del(ind) << endl;
                                        break;
                                case '3':
                                        cout << "Please enter the find value:";
                                        cin >> val;
                                        cout << "It in " << find(val) << endl;
                                        break;
                                case '4':
                                        cout << "Please enter the index:";
                                        cin >> ind;
                                        cout << "The value is " << show(ind) << endl;
                                        break;
                                case '5':
                                        print();
                                        break;
                                case '6':
                                        cout << length << endl;
                                        break;
                                case 'q':
                                case 'e':
                                        printx();
                                        putchar('m');
                                        return 0;
                                default:
                                        if(strcmp(inu, "Bleen")){
                                                cout << "Error: invalid index!" << endl;
                                                sleep(5);
                                                
                                        }else{
                                                throw INVALID_ORDER;
                                        }
                                        break;
                        }
                }
                catch(int error){
                        switch(error){
                                case NOT_FOUND:
                                        cout << "Error: not found!" << endl;        // 应该执行这条语句
                                        break;
                                case INVALID_INDEX:
                                        cout << "Error: invalid index!" << endl;
                                        break;
                                case NODE_CREATION_FAILURE:
                                        cout << "Error: node creation failure!" << endl;
                                        break;
                                case INVALID_ORDER:
                                        cout << "Error: invalid order!" << endl;
                                        break;
                        }
                }catch(...){
                        cout << "Error: unknown error!" << endl;
                }
        }
        putchar('n');
        return -1;
}

all.h
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fstream>
最佳答案
2023-10-28 12:36:02
KeyError 发表于 2023-10-28 10:52
你TM看清楚点!

我说的不是那里!

这个问题可能是由于在你的 `find` 函数中的循环条件出现了问题。在你的代码中,你的 `find` 函数如下:
int find(int value){
        Node *pTN = pHead;
        int index = 0;
        for(int i = 0;;i++, index++){
                if(pTN -> value == value){
                        return index;
                }
                if(i > length){
                        cout << "NOT FOUND" << endl;
                        throw NOT_FOUND;
                }
                pTN = pTN -> nextv;
        }       
}

在这个函数中,你的循环条件是一个无限循环 `for(int i = 0;;i++, index++)`,然后你在循环体内部通过 `if(i > length)` 来判断是否应该结束循环。但是,这个判断条件可能会导致问题。因为在你的代码中,`length` 是链表的长度,而 `i` 是循环的次数,它们的初始值都是0。当你在链表中添加一个节点后,`length` 会增加1,但是 `i` 仍然从0开始。所以,当你的链表只有一个节点时,`i` 会先于 `length` 增加,导致 `if(i > length)` 条件成立,然后抛出 `NOT_FOUND` 异常。

为了解决这个问题,你应该将 `if(i > length)` 改为 `if(i >= length)`。这样,当 `i` 和 `length` 都为0时,不会抛出 `NOT_FOUND` 异常,只有当 `i` 真正超过 `length` 时,才会抛出异常。这样就可以正确地处理只有一个节点的情况了。

另外,你的 `find` 函数在遍历链表时,没有检查当前节点是否为 `NULL`。如果链表为空或者你试图访问链表的尾部之后的节点,`pTN -> value` 和 `pTN -> nextv` 将会导致未定义的行为。你应该在访问 `pTN -> value` 和 `pTN -> nextv` 之前,检查 `pTN` 是否为 `NULL`。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-28 10:51:27 | 显示全部楼层
这段代码之所以在输入3和1后直接停止,没有打印出错信息,是因为在代码的异常处理部分没有处理到输入错误的情况。

在代码的异常处理部分,使用了try-catch语句来捕获可能发生的异常。但是,在捕获异常之前,使用了strcmp函数来判断输入的命令是否为"Bleen",如果不是,则抛出INVALID_ORDER异常。但是,如果输入的命令是一个无效的字符串,strcmp函数会返回非零值,导致抛出INVALID_ORDER异常的代码不会执行。因此,无效的命令不会被正确处理,程序会直接停止。

要解决这个问题,可以修改代码的异常处理部分。可以将判断输入命令是否为无效命令的代码移动到try-catch语句的外面,并使用一个新的变量来保存命令是否为无效命令的结果。然后,在捕获异常之后,判断该变量的值,如果为真,则抛出INVALID_ORDER异常。

修改后的代码如下:
while(1){
    cout << "Please enter a order(1.add node, 2.delete node, 3.find, 4.show, 5.print, 6.length, (e\\q).exit):";
    cin >> inu;
    system("cls");
    bool isValidOrder = strcmp(inu, "Bleen");
    try{
        if(!isValidOrder){
            throw INVALID_ORDER;
        }
        switch (inu[0]) {
            //...
        }
    }
    catch(int error){
        switch(error){
            //...
        }
    }
    catch(...){
        cout << "Error: unknown error!" << endl;
    }
}

这样修改后,无效的命令会被正确处理,并抛出INVALID_ORDER异常,程序不会直接停止。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-28 10:52:42 | 显示全部楼层
本帖最后由 KeyError 于 2023-10-28 10:55 编辑
isdkz 发表于 2023-10-28 10:51
这段代码之所以在输入3和1后直接停止,没有打印出错信息,是因为在代码的异常处理部分没有处理到输入错误的 ...


你TM看清楚点!

我说的不是那里!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-28 12:36:02 | 显示全部楼层    本楼为最佳答案   
KeyError 发表于 2023-10-28 10:52
你TM看清楚点!

我说的不是那里!

这个问题可能是由于在你的 `find` 函数中的循环条件出现了问题。在你的代码中,你的 `find` 函数如下:
int find(int value){
        Node *pTN = pHead;
        int index = 0;
        for(int i = 0;;i++, index++){
                if(pTN -> value == value){
                        return index;
                }
                if(i > length){
                        cout << "NOT FOUND" << endl;
                        throw NOT_FOUND;
                }
                pTN = pTN -> nextv;
        }       
}

在这个函数中,你的循环条件是一个无限循环 `for(int i = 0;;i++, index++)`,然后你在循环体内部通过 `if(i > length)` 来判断是否应该结束循环。但是,这个判断条件可能会导致问题。因为在你的代码中,`length` 是链表的长度,而 `i` 是循环的次数,它们的初始值都是0。当你在链表中添加一个节点后,`length` 会增加1,但是 `i` 仍然从0开始。所以,当你的链表只有一个节点时,`i` 会先于 `length` 增加,导致 `if(i > length)` 条件成立,然后抛出 `NOT_FOUND` 异常。

为了解决这个问题,你应该将 `if(i > length)` 改为 `if(i >= length)`。这样,当 `i` 和 `length` 都为0时,不会抛出 `NOT_FOUND` 异常,只有当 `i` 真正超过 `length` 时,才会抛出异常。这样就可以正确地处理只有一个节点的情况了。

另外,你的 `find` 函数在遍历链表时,没有检查当前节点是否为 `NULL`。如果链表为空或者你试图访问链表的尾部之后的节点,`pTN -> value` 和 `pTN -> nextv` 将会导致未定义的行为。你应该在访问 `pTN -> value` 和 `pTN -> nextv` 之前,检查 `pTN` 是否为 `NULL`。

评分

参与人数 1鱼币 +5 收起 理由
KeyError + 5 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-28 15:30:27 | 显示全部楼层
陶远航 发表于 2023-10-28 12:36
这个问题可能是由于在你的 `find` 函数中的循环条件出现了问题。在你的代码中,你的 `find` 函数如下:
...

谢谢但是问题还是没解决。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-28 15:37:38 | 显示全部楼层
KeyError 发表于 2023-10-28 15:30
谢谢但是问题还是没解决。

对不起,我可能没有完全理解你的问题。你的问题是在输入3和1后,程序在打印"It in"后停止,没有打印出错信息。这可能是因为在执行"find"操作时,你试图查找的值在链表中不存在,所以"find"函数抛出了NOT_FOUND异常。

但是,你的代码中有一个问题,那就是在"find"函数中,当i等于length时,你就抛出了NOT_FOUND异常。这可能会导致你在查找链表的最后一个元素时出现问题,因为在这种情况下,i等于length-1,但是你的代码在i等于length时就已经抛出了异常。所以,你应该在i大于等于length时才抛出异常,即将"if(i > length)"改为"if(i >= length)"。

另外,你的"find"函数在遍历链表时,没有检查当前节点是否为NULL。如果链表为空或者你试图访问链表的尾部之后的节点,"pTN -> value"和"pTN -> nextv"将会导致未定义的行为。你应该在访问"pTN -> value"和"pTN -> nextv"之前,检查"pTN"是否为NULL。

如果这些修改后问题仍然存在,那么问题可能在其他地方。你能提供更多的信息吗?例如,你在运行程序时的具体输入和输出是什么?你期望的输出是什么?这将有助于我更好地理解和解决你的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 17:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表