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

如何在C++中将空字符(Null character)作为字符打印输出?

解决C++字符串中空字符截断的问题

问题根源

你代码里的string s = "Hello\t\0world";是用C风格字符串初始化std::string,但C风格字符串以\0作为结束标志,所以std::string只会构造到第一个\0的位置,后面的world根本没被包含进字符串中,自然无法处理。

解决方案

只要绕开C风格字符串的截断特性,完整初始化包含\0的std::string,后续的转义处理逻辑就能正常工作。以下是几种可行方法:

方法1:带长度的构造函数

利用std::string的构造函数,明确指定要包含的字符总长度,这样就能保留中间的\0和后续字符:

#include <iostream>
#include <string>

int main() {
    const char raw_str[] = "Hello\t\0world";
    // sizeof(raw_str)包含编译器自动添加的末尾\0,减1后得到目标字符总数
    std::string s(raw_str, sizeof(raw_str) - 1);
    std::string k;
    
    for (char c : s) {
        switch(c) {
            case '\t':
                k += "\\t";
                break;
            case '\0':
                k += "\\0";
                break;
            default:
                k += c;
        }
    }
    std::cout << k << std::endl;
    return 0;
}

方法2:初始化列表构造

直接用字符初始化列表构造std::string,逐个指定所有字符,完全避开C风格字符串的截断问题:

#include <iostream>
#include <string>

int main() {
    std::string s = {'H','e','l','l','o','\t','\0','w','o','r','l','d'};
    std::string k;
    
    for (char c : s) {
        switch(c) {
            case '\t':
                k += "\\t";
                break;
            case '\0':
                k += "\\0";
                break;
            default:
                k += c;
        }
    }
    std::cout << k << std::endl;
    return 0;
}

方法3:使用assign方法指定长度

调用std::string的assign方法,传入C风格字符串指针和目标字符长度:

#include <iostream>
#include <string>

int main() {
    const char* raw_str = "Hello\t\0world";
    std::string s;
    // Hello\t\0world共12个字符,直接指定长度
    s.assign(raw_str, 12);
    std::string k;
    
    for (char c : s) {
        switch(c) {
            case '\t':
                k += "\\t";
                break;
            case '\0':
                k += "\\0";
                break;
            default:
                k += c;
        }
    }
    std::cout << k << std::endl;
    return 0;
}

额外优化

原代码中k = k + "...";可以改为k += "...";,后者直接在原字符串上追加,避免不必要的字符串拷贝,效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:07:15