C语言程序需求及代码修正:实现单词中'T'/'t'位置判断功能
修正后的C语言程序及错误分析
需求说明
编写C语言程序,判断输入单词中't'或'T'的位置并输出对应结果:
- 若单词前半部分(含中间字符)存在't'或'T',输出1;
- 若前半部分不存在,但后半部分存在,输出2;
- 若单词中完全不存在't'或'T',输出-1。
假设输入单词长度不超过50个字符。
原代码的错误点
- 重复读取输入:第二个
while循环内再次调用scanf("%s", word),会覆盖之前输入的单词,导致逻辑完全错误; - 字符与数值错误比较:用
word[l] != half、word[l] != i将字符(ASCII值)和长度数值比较,这是逻辑错误,应该比较的是索引l和长度相关的数值; - 逻辑运算符错误:判断字符为'T'或't'时使用
&&(逻辑与),一个字符不可能同时等于两个不同字符,应改为||(逻辑或); - 索引访问错误:循环中先执行
l++再访问word[l],会跳过第一个字符,且可能在循环末尾访问到\0之后的内存; - 最终判断逻辑错误:最后根据
i%2 !=0输出1的逻辑完全不符合需求,没有考虑是否找到目标字符的情况; - 无状态标记:没有用变量记录是否在前半/后半找到目标字符,导致找到时直接输出,可能出现多次输出的问题。
修正后的代码
#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
相关产品推荐
相关产品推荐

