如何使用C语言将字符串转换为单词首字母大写的标题格式
问题分析
- 核心逻辑错误:现有判断逻辑会把所有非空格字符最终转为小写,你连续写了两个独立的
if判断,第一个if把非空格字符转大写后,第二个if判断如果当前字符不是空格,就会走else分支把字符转回小写,完全抵消了大写转换的操作。 - 修改未生效:你所有修改都在函数内的局部数组
arr上执行,没有回写到传入的原字符串str,外层调用函数后原字符串没有任何变化,assert必然失败。 - 硬编码长度:固定循环14次的写法不通用,也容易出现字符串越界问题。
- 功能逻辑缺失:没有实现「单词首字母大写、其余字母小写」的标题格式判断规则,没有识别单词首字符的逻辑。
- 依赖缺失:你用到的
isSame函数没有实现,isspace、toupper等字符处理函数需要引入对应头文件。
修正代码
你现有代码混用了C和C语法,以下是兼容C的可运行修正实现:
#include <iostream> #include <cctype> #include <cassert> #include <cstring> // 补充缺失的字符串相等判断函数 bool isSame(const char* a, const char* b) { return strcmp(a, b) == 0; } void convertToRubrik(char str[]) { if (str == nullptr || str[0] == '\0') return; int str_len = strlen(str); bool next_is_word_start = true; // 标记下一个字符是否为单词首字符 for (int k = 0; k < str_len; k++) { if (isspace(str[k])) { next_is_word_start = true; } else { if (next_is_word_start) { str[k] = toupper(str[k]); next_is_word_start = false; } else { str[k] = tolower(str[k]); } } } } void autoConvertToRubrik() { char str1[] = "this is a test"; char str2[] = "THIS IS A TEST"; const char rubrik[] = "This Is A Test"; convertToRubrik(str1); convertToRubrik(str2); assert(isSame(str1, rubrik)); assert(isSame(str2, rubrik)); std::cout << "所有转换测试通过" << std::endl; } int main() { autoConvertToRubrik(); return 0; }
改动说明
- 新增
next_is_word_start标记识别单词首字符,严格符合标题格式的转换规则:单词首字母大写,其余字母小写。 - 直接修改传入的原字符串,不需要额外创建局部数组缓存,修改结果可以直接对外生效。
- 用
strlen动态获取字符串长度,避免硬编码长度带来的越界风险。 - 补充了缺失的
isSame函数实现,依赖标准库strcmp完成字符串比较。
内容的提问来源于stack exchange,提问作者AlligatorAlf
相关产品推荐
相关产品推荐

