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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:24:04