Форум программистов, компьютерный форум CyberForum.ru

Построчная обработка string - C++

Восстановить пароль Регистрация
 
Afar
1 / 1 / 0
Регистрация: 10.10.2012
Сообщений: 14
20.10.2012, 21:44     Построчная обработка string #1
Есть некий "многострочный" текст string s;. Задача состоит в том, чтобы после каждой строки, кроме последней, после каждого знака ' " ' и ' \ ' поставить ' \ '.
Например из текста:
cout << "123" << endl;
cout << "123\n123\n123132" << endl;

Нужно получить:

cout << \"123\" << endl;\
cout << \"123\\n123\\n123132\" << endl;
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
20.10.2012, 21:59     Построчная обработка string #2
Цитата Сообщение от Afar Посмотреть сообщение
Нужно получить:
Даже не скомпилируется. Да и сомнительно мне, что надо менять escape-последовательности.
Петррр
 Аватар для Петррр
5915 / 3352 / 333
Регистрация: 28.10.2010
Сообщений: 5,926
20.10.2012, 22:03     Построчная обработка string #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
 
void escape_string(std::string& str)
{
    std::string::size_type size = str.size();
    if (size == 0)
        return;
    for(int i = size - 1; i >= 0; --i)
        if (str[i] == '"' || str[i] == '\\')
            str.insert(i, "\\");
}
 
int main()
{
    std::string str = "\"123\\123\"";
    std::cout << str << std::endl;
    escape_string(str);
    std::cout << str << std::endl;
}
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
20.10.2012, 22:03     Построчная обработка string #4
левая граница ← 0
правая граница ← 0
результат ← ""
repeat forever
​ ​ ​ ​ ​правая граница ← первое-вхождение(строка, "\"\\", левая граница)
​ ​ ​ ​ ​if ​правая граница = вхождений-не-найдено then
​ ​ ​ ​ ​​ ​ ​ ​ ​результат ← результат + подстрока(строка, левая граница)
​ ​ ​ ​ ​​ ​ ​ ​ ​break
​ ​ ​ ​ ​else
​ ​ ​ ​ ​​ ​ ​ ​ ​результат ← результат + подстрока(строка, левая граница, правая граница – левая граница)
​ ​ ​ ​ ​​ ​ ​ ​ ​результат ← результат + "\"
​ ​ ​ ​ ​​ ​ ​ ​ ​левая граница ← правая граница
​ ​ ​ ​ ​end if
end repeat
return результат

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

подстрока(строка, индекс) возвращает подстроку строки от индекса до конца.

подстрока(строка, индекс, длина) возвращает подстроку строки от индекса до достижения индекса (индекс + длина – 1) или конца (в зависимости от того, что ближе).

Найти соответствующие методы std::string и реализовать алгоритм — домашнее задание. Вперёд.



Ну вот :( Всё взяли и испортили.
Afar
1 / 1 / 0
Регистрация: 10.10.2012
Сообщений: 14
20.10.2012, 22:04  [ТС]     Построчная обработка string #5
Цитата Сообщение от soon Посмотреть сообщение
Даже не скомпилируется. Да и сомнительно мне, что надо менять escape-последовательности.
А мне и не надо, чтобы это компилировалось.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
20.10.2012, 22:06     Построчная обработка string #6
Цитата Сообщение от Afar Посмотреть сообщение
А мне и не надо, чтобы это компилировалось.
А толку тогда изображать из этого "С++ код"? И, да, жду ответа про escape-последовательности.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2012, 22:14     Построчная обработка string
Еще ссылки по теме:

C++ Обработка строк класса string
C++ Какое одинаковое значение можно вернуть из функций <string> f () и vector < <string> > f()?
Двумерные массивы: построчная перестановка элементов C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Afar
1 / 1 / 0
Регистрация: 10.10.2012
Сообщений: 14
20.10.2012, 22:14  [ТС]     Построчная обработка string #7
Цитата Сообщение от Петррр Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
 
void escape_string(std::string& str)
{
    std::string::size_type size = str.size();
    if (size == 0)
        return;
    for(int i = size - 1; i >= 0; --i)
        if (str[i] == '"' || str[i] == '\\')
            str.insert(i, "\\");
}
 
int main()
{
    std::string str = "\"123\\123\"";
    std::cout << str << std::endl;
    escape_string(str);
    std::cout << str << std::endl;
}
Спасибо!

Добавлено через 4 минуты
Цитата Сообщение от soon Посмотреть сообщение
А толку тогда изображать из этого "С++ код"? И, да, жду ответа про escape-последовательности.
Я делаю автоматическую генерацию кода на C++. То есть при добавлении в файл вот этого:

cout << \"123\" << endl;\
cout << \"123\\n123\\n123132\" << endl;

Получится вполне себе компилирующийся код:


cout << "123" << endl;
cout << "123\n123\n123132" << endl;
Yandex
Объявления
20.10.2012, 22:14     Построчная обработка string
Ответ Создать тему
Опции темы

Текущее время: 16:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru