簡體   English   中英

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

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

字符串包含表示八進制字符的轉義序列。

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

\22是十進制 18 的八進制,因此當您顯示每個字符的數字版本時,您會看到 output。

如果 c++ 字符串不是零終止的,那么這將不起作用

strcpy(m, myString.c_str());

strcpy 復制到零,請改用 memcpy

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM