C语言单词首字母大写、其余小写功能调试求助
问题分析与代码修正
你的需求是将字符串中每个单词的首字母大写,其余字母小写,同时去除多余空格。当前代码的问题主要集中在main函数的字符处理逻辑上,以下是具体问题和修正方案:
原代码的核心错误
- 字符比较错误:使用双引号
" "比较字符,这是字符串字面量,应该用单引号' '来表示单个空格字符。 - 循环逻辑混乱:遇到空格后直接
break跳出循环,导致后续单词完全没有处理;内部的j循环逻辑无效,无法处理第二个单词的首字母。 - 未统一处理单词首字母:第一个单词的首字母依赖原输入的大写,未主动转大写;后续单词的首字母完全没有处理转大写的逻辑。
修正后的完整代码
#include <stdio.h> #include <string.h> #include <ctype.h> #define SIZE 100 void xoa(char s[100], int v) { int len = strlen(s); for (int i = v; i < len; i++) s[i] = s[i + 1]; s[len - 1] = '\0'; } void xoakt(char *s) { // 去掉中间连续的空格 for (int i = 0; i < strlen(s); i++) if (s[i] == ' ' && s[i + 1] == ' ') { xoa(s, i); i--; // 删除字符后回退索引,重新检查当前位置 } // 去掉开头的空格 if (s[0] == ' ') xoa(s, 0); // 去掉结尾的空格 int len = strlen(s); if (len > 0 && s[len - 1] == ' ') xoa(s, len - 1); } int main() { char s[SIZE]; printf("Enter string: "); fgets(s, SIZE, stdin); // 先去除多余空格 xoakt(s); int len = strlen(s); if (len == 0) { printf("\n"); return 0; } // 处理第一个单词的首字母 if (isalpha(s[0])) { s[0] = toupper(s[0]); } // 遍历后续字符,处理每个单词的首字母和其余小写 for (int i = 1; i < len; i++) { // 如果当前是空格,且下一个字符是字母,转大写 if (s[i] == ' ' && i + 1 < len && isalpha(s[i+1])) { s[i+1] = toupper(s[i+1]); i++; // 跳过已处理的首字母,避免重复处理 } else { // 非首字母的字母转小写 if (isalpha(s[i])) { s[i] = tolower(s[i]); } } } printf("%s\n", s); return 0; }
关键修正点说明
- 字符比较修正:所有空格比较改为
' ',符合C语言字符的表示规则。 - 首字母统一处理:主动将第一个字符转为大写,确保无论原输入是什么,首字母都是大写。
- 遍历逻辑优化:
- 遍历字符串时,遇到空格则检查下一个字符,若是字母则转大写,并跳过该首字母避免重复处理。
- 其余字母统一转为小写,确保非首字母的大小写都符合要求。
- 边界条件处理:增加了空字符串的判断,避免空指针错误。
测试输入 PrOgRaMmInG MeThOd ,修正后的代码会输出Programming Method,符合你的预期。
内容的提问来源于stack exchange,提问作者Chow
相关产品推荐
相关产品推荐

