Странность со спецсимволами в C -строки и непечатаемый ASCII - PullRequest
0 голосов
/ 09 апреля 2020

Мне нужно скопировать строку c ++ в массив char и затем декодировать ее. Массив char не обязательно должен заканчиваться нулем. Из-за закодированной природы многие символы являются необычными, а некоторые не могут быть напечатаны, и это вызывает проблемы.

Это то, что строка C ++ печатает как: std::cout << myString; Вывод:

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";

Обратите внимание, что это создается путем копирования вывода строки. Однако длина этой 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 

Почему \22 преобразуется в символ ASCII 18? Как я могу создать правильную, не кодируемую строку C из строки C ++, которая имеет литерал \22? Мне нужно иметь возможность сделать это для большого списка потенциально неизвестных кодированных строк, поэтому я бы предпочел не заменять \22 вручную на ASCII 18, по крайней мере, не зная, почему это происходит.

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

если строка c ++ не обнуляется, то это не сработает

strcpy(m, myString.c_str());

копий strcpy до нуля, используйте memcpy вместо

0 голосов
/ 10 апреля 2020

Строка символов содержит escape-последовательности, которые обозначают восьмеричные символы .

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

\22 является восьмеричным для десятичной 18, таким образом, вы выводите ' Вы видите, когда отображается номер c версии каждого символа.

...