鱼C论坛

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

[已解决]直接跳出

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

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

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

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

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

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

  7. struct Node{
  8.         int value = 0;
  9.         Node *nextv = NULL;
  10. };

  11. int length = 0;

  12. Node *pHead = NULL, *pEnd = NULL;

  13. void Create(){
  14.         Node *pNow = NULL;
  15.        
  16.         pNow = (Node *)malloc(sizeof(Node));
  17.         if(pNow == NULL){
  18.                 throw NODE_CREATION_FAILURE;
  19.         }
  20.         pNow -> value = 0;
  21.         pNow -> nextv = NULL;
  22.         pHead = pNow;
  23.        
  24.         length++;
  25. }

  26. void add(int index, int value){                // 在第index个节点前插入
  27.         Node *pTN = pHead, *pTn = pHead -> nextv, *pNow = NULL;
  28.         pNow = (Node *)malloc(sizeof(Node));
  29.         if(pNow == NULL){
  30.                 throw NODE_CREATION_FAILURE;
  31.         }
  32.         pNow -> value = value;
  33.         pNow -> nextv = NULL;
  34.         if(index < 0){
  35.                 throw INVALID_INDEX;
  36.         }
  37.         if(index == 0){
  38.                 pNow -> nextv = pHead;
  39.                 pHead = pNow;
  40.         }
  41.         index--;
  42.         for(int i = 0;i < index;i++){        // 找到第index个节点
  43.                 if(i > length){
  44.                         break;
  45.                 }
  46.                 pTn = pTn -> nextv;
  47.                 pTN = pTN -> nextv;
  48.         }
  49.         pNow -> nextv = pTn;
  50.         pTN -> nextv = pNow;
  51.         length++;
  52. }

  53. int del(int index){
  54.         Node *pTN = pHead, *pTn = pHead -> nextv;
  55.         int r;
  56.         if(index < 0){
  57.                 throw INVALID_INDEX;
  58.         }
  59.         if(index == 0){
  60.                 pHead = pTN -> nextv;
  61.                 r = pTN -> value;
  62.                 free(pTN);
  63.                 return r;
  64.         }
  65.         index--;
  66.         for(int i = 0;i < index;i++){
  67.                 if(i > length){
  68.                         break;
  69.                 }
  70.                 pTn = pTN;
  71.                 pTN = pTN -> nextv;
  72.         }
  73.         r = pTn -> value;
  74.         pTN -> nextv = pTn -> nextv;
  75.         free(pTn);
  76.         length--;
  77.         return r;       
  78. }

  79. int show(int index){
  80.         Node *pTN = pHead;
  81.         for(int i = 0;i < index;i++){
  82.                 if(i > length){
  83.                         throw INVALID_INDEX;
  84.                 }
  85.                 pTN = pTN -> nextv;
  86.         }
  87.         return pTN -> value;
  88. }
  89. int find(int value){
  90.         Node *pTN = pHead;
  91.         int index = 0;
  92.         for(int i = 0;;i++, index++){
  93.                 if(pTN -> value == value){
  94.                         return index;
  95.                 }
  96.                 if(i > length){
  97.                         cout << "NOT FOUND" << endl;
  98.                         throw NOT_FOUND;
  99.                 }
  100.                 pTN = pTN -> nextv;
  101.         }       
  102. }

  103. void print(){        // 打印链表
  104.         Node *pTN = pHead;
  105.         for(int i = 0;;){
  106.                 cout << (pTN -> value) << endl;
  107.                 sleep(1);
  108.                 if(i > length || pTN -> nextv == NULL){
  109.                         break;
  110.                 }
  111.                 pTN = pTN -> nextv;
  112.                 i++;
  113.         }
  114. }

  115. void printx(){
  116.         Node *pTN = pHead, *pTn = NULL;
  117.         for(int i = 0;;i++){
  118.                 cout << (pTN -> value) << endl;
  119.                 sleep(1);
  120.                 if(i > length || pTN -> nextv == NULL){
  121.                         break;
  122.                 }
  123.                 pTn = pTN -> nextv;
  124.                 free(pTN);
  125.                 pTN = pTn;
  126.         }
  127. }

  128. int main(){
  129.         char inu[6];
  130.         int ind, val;
  131.         Create();
  132.         while(1){
  133.                 cout << "Please enter a order(1.add node, 2.delete node, 3.find, 4.show, 5.print, 6.length, (e\\q).exit):";
  134.                 cin >> inu;
  135.                 system("cls");
  136.                 try{
  137.                         switch (inu[0]) {
  138.                                 case '1':
  139.                                         cout << "Please enter the value:";
  140.                                         cin >> val;
  141.                                         cout << "Please enter the index:";
  142.                                         cin >> ind;
  143.                                         add(ind, val);
  144.                                         break;
  145.                                 case '2':
  146.                                         cout << "Please enter the index:";
  147.                                         cin >> ind;
  148.                                         cout << "The value is " << del(ind) << endl;
  149.                                         break;
  150.                                 case '3':
  151.                                         cout << "Please enter the find value:";
  152.                                         cin >> val;
  153.                                         cout << "It in " << find(val) << endl;
  154.                                         break;
  155.                                 case '4':
  156.                                         cout << "Please enter the index:";
  157.                                         cin >> ind;
  158.                                         cout << "The value is " << show(ind) << endl;
  159.                                         break;
  160.                                 case '5':
  161.                                         print();
  162.                                         break;
  163.                                 case '6':
  164.                                         cout << length << endl;
  165.                                         break;
  166.                                 case 'q':
  167.                                 case 'e':
  168.                                         printx();
  169.                                         putchar('m');
  170.                                         return 0;
  171.                                 default:
  172.                                         if(strcmp(inu, "Bleen")){
  173.                                                 cout << "Error: invalid index!" << endl;
  174.                                                 sleep(5);
  175.                                                
  176.                                         }else{
  177.                                                 throw INVALID_ORDER;
  178.                                         }
  179.                                         break;
  180.                         }
  181.                 }
  182.                 catch(int error){
  183.                         switch(error){
  184.                                 case NOT_FOUND:
  185.                                         cout << "Error: not found!" << endl;        // 应该执行这条语句
  186.                                         break;
  187.                                 case INVALID_INDEX:
  188.                                         cout << "Error: invalid index!" << endl;
  189.                                         break;
  190.                                 case NODE_CREATION_FAILURE:
  191.                                         cout << "Error: node creation failure!" << endl;
  192.                                         break;
  193.                                 case INVALID_ORDER:
  194.                                         cout << "Error: invalid order!" << endl;
  195.                                         break;
  196.                         }
  197.                 }catch(...){
  198.                         cout << "Error: unknown error!" << endl;
  199.                 }
  200.         }
  201.         putchar('n');
  202.         return -1;
  203. }
复制代码


all.h
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6. #include <fstream>
复制代码
最佳答案
2023-10-28 12:36:02
KeyError 发表于 2023-10-28 10:52
你TM看清楚点!

我说的不是那里!

这个问题可能是由于在你的 `find` 函数中的循环条件出现了问题。在你的代码中,你的 `find` 函数如下:

  1. int find(int value){
  2.         Node *pTN = pHead;
  3.         int index = 0;
  4.         for(int i = 0;;i++, index++){
  5.                 if(pTN -> value == value){
  6.                         return index;
  7.                 }
  8.                 if(i > length){
  9.                         cout << "NOT FOUND" << endl;
  10.                         throw NOT_FOUND;
  11.                 }
  12.                 pTN = pTN -> nextv;
  13.         }      
  14. }
复制代码


在这个函数中,你的循环条件是一个无限循环 `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`。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

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

修改后的代码如下:

  1. while(1){
  2.     cout << "Please enter a order(1.add node, 2.delete node, 3.find, 4.show, 5.print, 6.length, (e\\q).exit):";
  3.     cin >> inu;
  4.     system("cls");
  5.     bool isValidOrder = strcmp(inu, "Bleen");
  6.     try{
  7.         if(!isValidOrder){
  8.             throw INVALID_ORDER;
  9.         }
  10.         switch (inu[0]) {
  11.             //...
  12.         }
  13.     }
  14.     catch(int error){
  15.         switch(error){
  16.             //...
  17.         }
  18.     }
  19.     catch(...){
  20.         cout << "Error: unknown error!" << endl;
  21.     }
  22. }
复制代码


这样修改后,无效的命令会被正确处理,并抛出INVALID_ORDER异常,程序不会直接停止。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


你TM看清楚点!

我说的不是那里!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我说的不是那里!

这个问题可能是由于在你的 `find` 函数中的循环条件出现了问题。在你的代码中,你的 `find` 函数如下:

  1. int find(int value){
  2.         Node *pTN = pHead;
  3.         int index = 0;
  4.         for(int i = 0;;i++, index++){
  5.                 if(pTN -> value == value){
  6.                         return index;
  7.                 }
  8.                 if(i > length){
  9.                         cout << "NOT FOUND" << endl;
  10.                         throw NOT_FOUND;
  11.                 }
  12.                 pTN = pTN -> nextv;
  13.         }      
  14. }
复制代码


在这个函数中,你的循环条件是一个无限循环 `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有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢但是问题还是没解决。
小甲鱼最新课程 -> https://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。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 09:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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