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
相关产品推荐
相关产品推荐

