[英]Strangeness with special characters in C-strings and unprintable ASCII
我需要将 c++ 字符串复制到 char 数组中,然后对其进行解码。 char 数组不需要被 null 终止。 由于编码的性质,许多字符是不寻常的,有些是不可打印的,这会导致问题。
这是 C++ 字符串打印为: std::cout << myString;
Output:
mw\22ypwr\`himg 0few1nvnl
通过执行以下操作将其转换为char []
:
char * m = new char[myString.size() + 1];
strcpy(m, myString.c_str());
m*
的长度为 24,不正确。 它无法正确解码。 以下char []
可以正确解码:
char m2 [] = "mw\22ypwr`himg 0few1nvnl";
请注意,这是通过复制字符串的 output 创建的。 但是,这个 c 字符串的长度只有 22,而不是 24。此外,打印它有以下结果:
std::cout << m;
Output:
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
为什么\22
被转换为 ASCII 字符 18? 如何从具有文字\22
的 C++ 字符串构造正确的、可解码的 C 字符串? 我需要能够为大量可能未知的编码字符串执行此操作,因此我不希望在不知道为什么会发生这种情况的情况下手动将\22
替换为 ASCII 18。
如果 c++ 字符串不是零终止的,那么这将不起作用
strcpy(m, myString.c_str());
strcpy 复制到零,请改用 memcpy
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.