字符串交替字符匹配C程序修正:符合指定测试用例需求
修正C语言字符串交替规则判断程序
需求说明
编写C语言程序判断字符串是否满足以下规则:
- 所有间隔一位的字符相同(即第0位=第2位=第4位…,第1位=第3位=第5位…)
- 相邻字符必须不同
- 规则覆盖整个字符串
满足条件输出YES,否则输出NO。
测试用例
输入:
3 CFCFCF CRGHIT CGIRST
预期输出:
YES NO NO
现有程序的问题
- 循环越界:原循环条件
i < strlen(ticketnumber)会导致访问ticketnumber[i+2]时超出字符串有效范围,引发未定义行为。 - flag逻辑错误:初始
flag设为false,仅单次满足条件就置为true,后续即使出现不满足的情况,flag仍保持true,会错误输出YES。 - 规则覆盖不全:仅检查连续三个字符的关系,无法确保整个字符串的所有交替位置字符一致。
修正后的代码
方案一:分步验证相邻字符与间隔字符
#include <stdio.h> #include <stdbool.h> #include <string.h> int main() { int T; char ticketnumber[102]; scanf("%d", &T); while (T--) { bool flag = true; scanf("%s", ticketnumber); int len = strlen(ticketnumber); // 处理长度小于2的边界情况 if (len < 2) { printf("YES\n"); continue; } // 验证所有相邻字符不同 for (int i = 0; i < len - 1; i++) { if (ticketnumber[i] == ticketnumber[i+1]) { flag = false; break; } } // 相邻字符均不同时,验证间隔一位的字符相同 if (flag) { for (int i = 0; i < len - 2; i++) { if (ticketnumber[i] != ticketnumber[i+2]) { flag = false; break; } } } printf("%s\n", flag ? "YES" : "NO"); } return 0; }
方案二:直接验证交替位一致性
#include <stdio.h> #include <stdbool.h> #include <string.h> int main() { int T; char ticketnumber[102]; scanf("%d", &T); while (T--) { bool flag = true; scanf("%s", ticketnumber); int len = strlen(ticketnumber); if (len < 2) { printf("YES\n"); continue; } // 首先确保首两位不同 if (ticketnumber[0] == ticketnumber[1]) { flag = false; } else { // 验证所有偶数位等于首字符,奇数位等于第二个字符 for (int i = 2; i < len; i++) { if ((i % 2 == 0 && ticketnumber[i] != ticketnumber[0]) || (i % 2 == 1 && ticketnumber[i] != ticketnumber[1])) { flag = false; break; } } } printf("%s\n", flag ? "YES" : "NO"); } return 0; }
修正说明
- 将
flag初始值设为true,一旦发现不满足条件的情况立即置为false并跳出循环,逻辑更严谨。 - 提前获取字符串长度
len,避免循环中多次调用strlen影响效率,同时明确循环边界防止越界。 - 方案二直接针对题目规则验证,逻辑更直观:确保首两位不同,且所有偶数位与首字符一致、奇数位与第二个字符一致,完全覆盖规则要求。
内容的提问来源于stack exchange,提问作者Sachin Bhujbal
相关产品推荐
相关产品推荐

