C语言删除数组指定元素所有出现项的代码显示异常问题
数组删除指定元素所有出现项的代码问题修复
这段C语言代码原本是要删除数组中某个整数的所有出现项,但运行时会出问题:找到第一个匹配元素后,数组剩余部分显示异常。
原代码
unsigned int T[10], n, i, j, exist, integerDeleteOccurences; printf("Array length : "); scanf("%u", &n); for(i=0; i<n; i++) { printf("T[%u] : ", i); scanf("%u", &T[i]); } for(i=0; i<n; i++) { printf("%u | ", T[i]); } printf("The number you want to delete its occurences : "); scanf("%u", &integerDeleteOccurences); exist = 0; for (i=0; i<n; i++) { if (T[i] == integerDeleteOccurences) { j = i; for (j=i; j<n-1; j++); { T[j] = T[j+1]; } exist = 1; i--; n--; } } if (exist == 1) { for (i=0; i<n; i++) { printf("%u | ", T[i]); } } else if (exist == 0) { printf("This number doesn't exist in the array ! \n"); }
问题根源
核心错误是内层for循环后面多了一个分号;。这个分号会让for循环变成空循环,循环结束后j的值直接跳到n-1,之后花括号里的T[j] = T[j+1];只执行一次,仅仅把最后一个元素覆盖,并没有完成从i位置开始的所有后续元素前移操作,导致数组结构混乱,后续显示异常。
修复后的代码
只需要去掉内层for循环后的分号即可:
unsigned int T[10], n, i, j, exist, integerDeleteOccurences; printf("Array length : "); scanf("%u", &n); for(i=0; i<n; i++) { printf("T[%u] : ", i); scanf("%u", &T[i]); } for(i=0; i<n; i++) { printf("%u | ", T[i]); } printf("The number you want to delete its occurences : "); scanf("%u", &integerDeleteOccurences); exist = 0; for (i=0; i<n; i++) { if (T[i] == integerDeleteOccurences) { j = i; // 去掉这里的分号 for (j=i; j<n-1; j++) { T[j] = T[j+1]; } exist = 1; i--; n--; } } if (exist == 1) { for (i=0; i<n; i++) { printf("%u | ", T[i]); } } else if (exist == 0) { printf("This number doesn't exist in the array ! \n"); }
修复说明
去掉分号后,花括号内的代码成为for循环的循环体,会从j=i开始,依次把T[j+1]的值赋给T[j],直到j到达n-2,完成所有后续元素的前移,这样就能正确删除匹配的元素,数组剩余部分也能正常显示。
内容的提问来源于stack exchange,提问作者Bacim OUESLATI
相关产品推荐
相关产品推荐

