You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

字符串交替字符匹配C程序修正:符合指定测试用例需求

修正C语言字符串交替规则判断程序

需求说明

编写C语言程序判断字符串是否满足以下规则:

  • 所有间隔一位的字符相同(即第0位=第2位=第4位…,第1位=第3位=第5位…)
  • 相邻字符必须不同
  • 规则覆盖整个字符串
    满足条件输出YES,否则输出NO。

测试用例

输入:

3
CFCFCF
CRGHIT
CGIRST

预期输出:

YES
NO
NO

现有程序的问题

  1. 循环越界:原循环条件i < strlen(ticketnumber)会导致访问ticketnumber[i+2]时超出字符串有效范围,引发未定义行为。
  2. flag逻辑错误:初始flag设为false,仅单次满足条件就置为true,后续即使出现不满足的情况,flag仍保持true,会错误输出YES。
  3. 规则覆盖不全:仅检查连续三个字符的关系,无法确保整个字符串的所有交替位置字符一致。

修正后的代码

方案一:分步验证相邻字符与间隔字符

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 17:31:57