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

C语言程序需求及代码修正:实现单词中'T'/'t'位置判断功能

修正后的C语言程序及错误分析

需求说明

编写C语言程序,判断输入单词中't'或'T'的位置并输出对应结果:

  • 若单词前半部分(含中间字符)存在't'或'T',输出1;
  • 若前半部分不存在,但后半部分存在,输出2;
  • 若单词中完全不存在't'或'T',输出-1。

假设输入单词长度不超过50个字符。

原代码的错误点

  1. 重复读取输入:第二个while循环内再次调用scanf("%s", word),会覆盖之前输入的单词,导致逻辑完全错误;
  2. 字符与数值错误比较:用word[l] != half、word[l] != i将字符(ASCII值)和长度数值比较,这是逻辑错误,应该比较的是索引l和长度相关的数值;
  3. 逻辑运算符错误:判断字符为'T'或't'时使用&&(逻辑与),一个字符不可能同时等于两个不同字符,应改为||(逻辑或);
  4. 索引访问错误:循环中先执行l++再访问word[l],会跳过第一个字符,且可能在循环末尾访问到\0之后的内存;
  5. 最终判断逻辑错误:最后根据i%2 !=0输出1的逻辑完全不符合需求,没有考虑是否找到目标字符的情况;
  6. 无状态标记:没有用变量记录是否在前半/后半找到目标字符,导致找到时直接输出,可能出现多次输出的问题。

修正后的代码

#include <stdio.h>

int main(void) {
    char word[51];
    int len = 0;
    int half;
    int found_front = 0;  // 标记前半部分是否找到't'/'T'
    int found_back = 0;   // 标记后半部分是否找到't'/'T'

    // 读取输入单词
    scanf("%s", word);

    // 计算单词长度
    while (word[len] != '\0') {
        len++;
    }
    half = len / 2;
    // 处理奇数长度的情况,中间字符算前半部分
    if (len % 2 != 0) {
        half += 1;
    }

    // 遍历单词检查每个字符
    for (int l = 0; l < len; l++) {
        if (word[l] == 't' || word[l] == 'T') {
            if (l < half) {
                found_front = 1;
            } else {
                found_back = 1;
            }
        }
    }

    // 根据标记输出结果
    if (found_front) {
        printf("1\n");
    } else if (found_back) {
        printf("2\n");
    } else {
        printf("-1\n");
    }

    return 0;
}

修正说明

  • 增加found_front和found_back两个状态变量,分别记录前半、后半部分是否找到目标字符;
  • 正确计算前半部分的范围:奇数长度时,中间字符归为前半部分(比如长度5,前半是0-2索引);
  • 使用for循环遍历单词,避免索引越界和跳过字符的问题;
  • 正确使用逻辑或||判断目标字符;
  • 最后根据状态变量的情况输出对应结果,确保只输出一次正确结果;
  • 移除了无意义的重复输入读取代码。

内容的提问来源于stack exchange,提问作者C_luna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 05:50:11