首页 > 解决方案 > C 字符串中的特殊字符和不可打印的 ASCII 的奇怪之处

问题描述

我需要将 c++ 字符串复制到 char 数组中,然后对其进行解码。char 数组不需要以空值结尾。由于编码的性质,许多字符是不寻常的,有些是不可打印的,这会导致问题。

这是 C++ 字符串打印的内容: std::cout << myString; 输出:

mw\22ypwr\`himg 0few1nvnl

char []通过执行以下操作将其转换为 a :

char * m = new char[myString.size() + 1];
strcpy(m, myString.c_str());

m*长度为 24,不正确。它无法正确解码。以下char []确实正确解码:

char m2 [] = "mw\22ypwr`himg 0few1nvnl";

请注意,这是通过复制字符串的输出创建的。但是,这个 c 字符串的长度只有 22,而不是 24。此外,打印它有以下结果:

std::cout << m;

输出:

mwypwr`himg 0few1nvnl

请注意,\22消失了。但是,它并不像在将字符串转换为char[]. 遍历 ASCII 值显示有一个十进制操作码为 的字符,18以前\22是 。该字符不打印。

ASCII 值作为十进制:

109 119 18 121 112 119 114 96 104 105 109 103 32 48 102 101 119 49 110 118 110 108 

为什么将\22get 转换为 ASCII 字符 18?如何从具有文字的 C++ 字符串构造正确的、可解码的 C 字符串\22?我需要能够为大量可能未知的编码字符串执行此操作,因此我不希望\22在至少不知道为什么会发生这种情况的情况下手动替换为 ASCII 18。

标签: c++cstringasciinon-ascii-characters

解决方案


字符串包含表示八进制字符的转义序列。

"mw\22ypwr\...other characters..."

十进制 18 是八进制的\22,因此当您显示每个字符的数字版本时,您会看到输出。


推荐阅读