PenaltyShootout.exe运行崩溃及格式化警告问题求助
解决PenaltyShootout程序崩溃与功能错误问题
咱们先拆解一下你遇到的问题,然后一步步把代码修复好:
1. 导致程序崩溃的核心原因
你代码里的这行是关键错误:
scanf("%s",str[i][500]);
str[i][500]是单个字符(二维数组里第i行的第500个元素),但scanf("%s")需要的是字符串的起始地址(char*类型)。你强行转成(char*)只是骗过了编译器,本质是给了一个非法的内存地址,程序运行时访问这块内存直接就崩溃了。
正确的写法应该传递第i个字符串的首地址:
scanf("%s", str[i]);
2. 其他需要修复的功能逻辑问题
除了崩溃问题,你的代码还有两个影响功能的小错误:
- 统计结果没有重置:变量
n在多个测试用例之间没有清零,导致后面的测试用例会累加之前的统计数,结果肯定不对。 - 输入残留换行符问题:用
scanf("%d", &T)读取测试用例数后,输入缓冲区会留下一个换行符,接下来的scanf("%s")会直接读取这个空行,导致第一个测试用例的字符串为空。可以在读取T之后用getchar()吃掉这个换行符。
修复后的完整代码
#include <stdio.h> #include <string.h> int main() { int T, i; char str[100][500]; do { printf("Enter the number of Test cases(must be between 1 and 100):\n"); scanf("%d", &T); // 吃掉输入T后残留的换行符,避免后续读空字符串 getchar(); } while (T < 1 || T > 100); // 补充T<1的判断,原来只限制了上限 for (i = 0; i < T; i++) { printf("Enter the test case %d\n", i + 1); // 用i+1更符合用户习惯(从1开始计数) scanf("%s", str[i]); } for (i = 0; i < T; i++) { int n = 0; // 每个测试用例单独初始化n,避免累加之前的结果 int len = strlen(str[i]); // 遍历到倒数第二个字符,确保j+1不会越界 for (int j = 0; j < len - 1; j++) { if (str[i][j] == '2' && str[i][j+1] == '1') { n++; } } printf("%d\n", n); } return 0; }
修复说明
- 修正了
scanf的参数,传入正确的字符串首地址,彻底解决崩溃问题。 - 每个测试用例循环内重新初始化
n,保证每个用例的统计结果独立。 - 添加
getchar()处理换行符,避免第一个测试用例读取空字符串。 - 完善了测试用例数的输入判断(补充
T<1的限制,符合题目要求的1到100范围)。 - 优化了测试用例的提示文字(从1开始计数更贴合用户使用习惯)。
内容的提问来源于stack exchange,提问作者Md Arshad Ali
相关产品推荐
相关产品推荐

