C 字符串中特殊字符和不可打印的 ASCII 的奇怪之处

Strangeness with special characters in C-strings and unprintable ASCII

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

C++ 字符串打印如下: std::cout << myString; 输出:

mwypwr\`himg 0few1nvnl

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

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

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

char m2 [] = "mwypwr`himg 0few1nvnl";

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

std::cout << m;

输出:

mwypwr`himg 0few1nvnl

注意 </code> 不见了。但是,它并不像在将其转换为 <code>char[] 之前从字符串中删除它那么简单。遍历 ASCII 值显示有一个字符的十进制操作码为 18,而 </code> 曾经是。此字符不打印。</p> <p>十进制的 ASCII 值:</p> <pre><code>109 119 18 121 112 119 114 96 104 105 109 103 32 48 102 101 119 49 110 118 110 108

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

字符串包含表示octal characters的转义序列。

"mwypwr\...other characters..."

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

如果 C++ 字符串不是零终止的,那么这将不起作用

strcpy(m, myString.c_str());

strcpy 复制直到遇到零,改用 memcpy