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

