Почему я не могу использовать & quot;% 20 & quot; в строке?

Я использую функцию, которую я нашел в этот вопрос, адаптировано для замены всех пробелов на «% 20» (возможно, это можно сделать гораздо эффективнее!):

## Heading ##std::string Main::SpacesForWeb(std::string text) {
for (std::string::iterator it = text.begin(); it != text.end(); ++it) {
if (*it == ' ') {
*it = '%20';
}
}
return text;
}

Однако, когда я пытаюсь использовать его для такой строки, как Local Live Test Server, вывод такой:

введите описание изображения здесь

Мой последний вопрос касался string проблемы и выяснили, что string является typedefЭд указывает на внутренний CryString введите в игре SDK, который я использую (CryEngine2). Я сейчас пользуюсь std::string чтобы противостоять этому.

Эта проблема также отражена в базе данных, которую я использую, после того, как произойдет преобразование и данные будут отправлены в базу данных:

введите описание изображения здесь

Почему я не могу использовать %20 (и, возможно, другие символы кодирования URL) таким образом, и как я могу заставить это работать?
Я попытался провести некоторое исследование по этому вопросу, чтобы решить проблему самостоятельно, но, тем не менее, ничего подходящего не произошло.

Я пытался использовать *it = (char)"%20"; на месте *it = (char)"%20";, но это на самом деле удаляет 0 который появляется в строке вместо замены пробелов %20,

-3

Решение

Потому что язык C ++ ничего не знает ни о какой «кодировке URL». С точки зрения языка С ++ ваш '%20' является многосимвольной константой, которая обозначает определенное для реализации значение типа char (многосимвольные константы — неясная особенность языков C и C ++).

Если вы хотите (или должны) использовать "%20" в вашей строке для передачи какому-либо получателю с URL-адресом вам нужно будет вставить «% 20» в качестве подстроки (три символа) в вашу строку.

Ваши попытки конвертировать строковый литерал "%20" Тип персонажа ничего не добьется. Невозможно втиснуть три символа в место одного. Вам нужно будет «сдвинуть» хвостовую часть вашей строки, чтобы освободить место для трех символов, в которых раньше находился один.

В этих обстоятельствах может иметь смысл сгенерировать новый результат в отдельной строке.

std::string new_text;

for (std::string::const_iterator it = text.begin(); it != text.end(); ++it) {
if (*it == ' ')
new_text += "%20";
else
new_text += *it;
}

return new_text;

Хотя при некотором тщательном программировании это можно сделать прямо в исходной строке.

9

Другие решения

Я пытался использовать * it = (char) «% 20»; вместо * it = (char) «% 20»; но это фактически удаляет 0, появляющийся в строке, вместо замены пробелов на% 20.

Пожалуйста, не применяйте дурацкие привычки PHP к C ++, вы не можете просто сказать «притвориться, что эта строка — один символ» и ожидать чего-то разумного. "%20" массив, приведя его к char берет адрес первого элемента (который является 32-битным или 64-битным значением указателя), а затем усекает его до размера char, вероятно, 8 бит, и это даст вам мусор.

'%' это персонаж, и '2' это персонаж, но '%20' не персонаж, поэтому вы не можете разумно назначить его char,

(Технически '%20' многосимвольная константа со значением, определяемым реализацией, которое с моим компилятором 0x253230что явно слишком велико, чтобы поместиться в 8-битные символы моего компилятора)

2.13.3 [lex.ccon] говорит:

Обычный символьный литерал, содержащий более одного с-символ это многозначный буквальный. Мультихарактерлитеральный или обычный символьный литерал, содержащий один с-символ не представлен в наборе символов выполнения, условно поддерживается, имеет тип intи имеет значение, определяемое реализацией.

Есть несколько способов заменить отдельные символы на строки (ответ AndreyT показывает хороший простой подход), но просто пытаются разбить что-то, что не является char в байт памяти, держащей один char никогда не будет работать.

5

По вопросам рекламы [email protected]