直接跳出
这段代码为什么在输入: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;
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) {
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> 这段代码之所以在输入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) {
//...
}
}
catch(int error){
switch(error){
//...
}
}
catch(...){
cout << "Error: unknown error!" << endl;
}
}
这样修改后,无效的命令会被正确处理,并抛出INVALID_ORDER异常,程序不会直接停止。 本帖最后由 KeyError 于 2023-10-28 10:55 编辑
isdkz 发表于 2023-10-28 10:51
这段代码之所以在输入3和1后直接停止,没有打印出错信息,是因为在代码的异常处理部分没有处理到输入错误的 ...
你TM看清楚点!
我说的不是那里! 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`。 陶远航 发表于 2023-10-28 12:36
这个问题可能是由于在你的 `find` 函数中的循环条件出现了问题。在你的代码中,你的 `find` 函数如下:
...
谢谢但是问题还是没解决。 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。
如果这些修改后问题仍然存在,那么问题可能在其他地方。你能提供更多的信息吗?例如,你在运行程序时的具体输入和输出是什么?你期望的输出是什么?这将有助于我更好地理解和解决你的问题。
页:
[1]