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

C++编译时去除const char*空白字符的实现方案咨询

C++编译时去除字符串空白的 constexpr 实现

针对编译时去除const char*(或字符串字面量)中的空白字符需求,结合C++17及以后的标准特性,以下是几种可靠的实现方案:

核心思路

编译时字符串操作的关键是在编译期确定输入字符串的长度,并生成固定大小的结果数组。直接使用const char*作为输入无法在编译期获取长度,因此优先推荐使用字符串字面量或固定大小的字符数组作为输入。

方案1:C++17 兼容实现

先实现编译期计算非空白字符长度的辅助函数,再生成处理后的字符数组:

#include <array>
#include <cctype>

// 编译期统计非空白字符数量
constexpr size_t count_non_whitespace(const char* str) {
    size_t count = 0;
    for (; *str != '\0'; ++str) {
        // 转换为unsigned char避免处理负数值字符
        if (!std::isspace(static_cast<unsigned char>(*str))) {
            ++count;
        }
    }
    return count;
}

// 编译期处理字符串,返回去除空白后的std::array
template<size_t N>
constexpr auto strip_whitespace_impl(const char (&str)[N]) {
    constexpr size_t result_len = count_non_whitespace(str);
    std::array<char, result_len + 1> result{}; // 自动初始化为0,末尾的'\0'已包含
    size_t idx = 0;

    for (size_t i = 0; i < N; ++i) {
        if (!std::isspace(static_cast<unsigned char>(str[i]))) {
            result[idx++] = str[i];
        }
    }
    return result;
}

// 宏封装,直接返回处理后的字符串指针
#define STRIP_WHITESPACE(str) [](){constexpr auto arr = strip_whitespace_impl(str); return arr.data();}()

用法示例

constexpr static const char initial_arr[] = "hello world   test";
// 方式1:直接获取处理后的数组指针
constexpr static const char* after = STRIP_WHITESPACE("hello world   test");

// 方式2:保留数组,可直接访问
constexpr auto after_arr = strip_whitespace_impl(initial_arr);
constexpr static const char* after2 = after_arr.data();

方案2:C++20 优化实现(consteval + 字符串字面量)

利用C++20的consteval关键字强制函数仅在编译期执行,结合字符串字面量模板进一步简化:

#include <array>
#include <cctype>
#include <string_view>

template<std::size_t N>
consteval std::array<char, count_non_whitespace(std::string_view("") + std::span<const char, N>()) + 1>
strip_whitespace(const char (&str)[N]) {
    std::array<char, count_non_whitespace(str) + 1> res{};
    size_t idx = 0;
    for (char c : str) {
        if (c == '\0') break;
        if (!std::isspace(static_cast<unsigned char>(c))) {
            res[idx++] = c;
        }
    }
    res[idx] = '\0';
    return res;
}

用法示例

constexpr auto after_arr = strip_whitespace("hello world   test");
constexpr static const char* after = after_arr.data();

注意事项

  • 输入必须是编译期已知长度的字符串(字面量或固定数组),const char*无法在编译期确定长度,无法直接作为输入。
  • 使用std::isspace时必须将char转换为unsigned char,避免因字符编码导致的负数判断错误。
  • C17及以上支持constexpr版本的std::array操作,C20的consteval可彻底避免运行时执行的可能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 10:25:32