UVA482在线评测Runtime Error问题求助
解决UVA482程序的Runtime Error问题
错误原因分析
- 数组越界访问:你的
pos数组定义为int pos[101];,最多仅能存储100个位置值(索引范围0~100),但UVA482的测试用例可能包含超过100个元素的场景。当输入的位置数量超过100时,pos[i]会写入数组边界外的内存区域,破坏其他变量或数据结构,直接触发Runtime Error。 - 输入缓冲区残留干扰:读取测试用例数量
testcases后,缓冲区中残留的换行符可能干扰后续getchar()的判断逻辑,虽不直接导致崩溃,但会加剧越界错误的触发概率。
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char ch, permute[1001][101], ans[1001][101]; int i, j, testcases, pos[1001]; // 增大pos数组容量,匹配permute和ans的规模 scanf("%d", &testcases); getchar(); // 清除testcases后的换行符,避免干扰后续输入 while (testcases--) { ch = '\0'; for (i = 0; ch != '\n' && i < 1000; i++) { // 限制i的最大值,防止数组越界 scanf("%d", &pos[i]); ch = getchar(); } for (j = 0; j < i; j++) { scanf("%s", permute[j]); } for (j = 0; j < i; j++) { strcpy(ans[pos[j] - 1], permute[j]); } for (j = 0; j < i; j++) { printf("%s\n", ans[j]); } if (testcases != 0) { printf("\n"); } // 移除不必要的memset调用,下一次循环会覆盖对应位置的数据 } return 0; }
修正说明
- 扩大
pos数组至1001个元素,确保能容纳最多1000个位置值,与permute、ans的元素数量匹配,从根源避免越界。 - 在读取
testcases后添加getchar(),清除缓冲区残留的换行符,保证后续输入读取逻辑的正确性。 - 在读取位置的循环中增加
i < 1000的判断,进一步防止极端输入导致的数组越界。 - 移除不必要的
memset调用,减少冗余操作,提升运行效率。
内容的提问来源于stack exchange,提问作者Anthony
相关产品推荐
相关产品推荐

