[英]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.