Строковые литералы Delphi / Pascal для C / C ++ - PullRequest
1 голос
/ 24 февраля 2011

Я пытаюсь написать функцию для преобразования строкового литерала в Delphi / паскаль в эквивалент C. Строковый литерал в Delphi соответствует регулярному выражению ("#"([0-9]{1,5}|"$"[0-9a-fA-F]{1,6})|"'"([^']|'')*"'")+, поэтому строка

"This is a test with a tab\ta breakline\nand apostrophe '"

будет написано на Паскале как

'This is a test with a tab'#9'a breakline'#$A'and apostrophe '''

Мне удалось убрать апострофы, но у меня проблемы с управлением специальными символами.

1 Ответ

1 голос
/ 25 февраля 2011

Просто используйте функцию replaceApp(), которую можно найти по адресу: http://www.cppreference.com/wiki/string/basic_string/replace

Тогда код может выглядеть так:

string s1 = "This is a test with a tab\\ta breakline\\nand apostrophe '";
string s2 = s1;
s2 = replaceAll(s2, "'", "''");
s2 = replaceAll(s2, "\\t", "'$7'");
s2 = replaceAll(s2, "\\n", "'$10'");
cout << "'" << s2 << "'";

Конечно, изменения '\ t' -> '$ 7' могут быть сохранены в некоторой структуре, которую вы можете использовать в цикле вместо замены каждого элемента в отдельных строках.

Edit:

Второе решение (пример взят из комментария) с использованием map:

typedef map <string, string> MapType;
string s3 = "'This is a test with a tab'#9'a breakline'#$A'and apostrophe '''";
string s5 = s3;
MapType replace_map;
replace_map["'#9'"] = "\\t";
replace_map["'#$A'"] = "\\n";
replace_map["''"] = "'";
MapType::const_iterator end = replace_map.end();
for (MapType::const_iterator it = replace_map.begin(); it != end; ++it)
    s5 = replaceAll(s5, it->first, it->second);
cout << "s5 = '" << s5 << "'" << endl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...