Мне нужно скопировать строку 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, по крайней мере, не зная, почему это происходит.