Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Обработать строку / 13 сообщений из 13, страница 1 из 1
08.02.2019, 13:07
    #39771068
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать строку
Как красиво в С сделать следующее:

есть строка, надо заменить в ней в ней многократно повторяющиеся запятые (,) на одну, исключая случаи, когда они в кавычках

aa,,a,,,,bbb',,'

должно вернуть
aa,a,bbb',,'
...
Рейтинг: 0 / 0
08.02.2019, 13:39
    #39771092
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать строку
Ролг ХупинКак красиво в С сделать

Цикл копирования из одного буфера в другой с простеньким конечным автоматом с состояниями
"ништяк", "была запятая", "была кавычка".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.02.2019, 13:50
    #39771099
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать строку
выдели буфер такого же размера как исходная строка и переноси в него символы по одному, проверяя их.
Если последний перенесенный символ запятая и следующий за ним - запятая, то игнорим их, до тех пор пока не встретится новый символ не запятая, либо конец строки.

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

Если могут быть кавычки непарные, то после первой обнаруженной кавычки надо смотреть вперед, есть ли у нее закрывающая. Если есть, то это парный блок, который копируется as is. Если парной нет, то дальше продолжаем переносить как и обычно.

Если память исходной строки твоя, то можно не выделять новый буфер, а просто смещать строку посимвольно справа налево, а алгоритм уже известен. Таким образом значимые символы затрут лишние запятые, "наехав" на них. Но может получиться дофига копирований хвоста строки, что может быть не очень хорошо, особенно когда строки большие. Лучше один раз выделить память и заполнять ее последовательно
...
Рейтинг: 0 / 0
08.02.2019, 13:54
    #39771104
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать строку
CerebrumЕсли память исходной строки твоя, то можно не выделять новый буфер, а просто смещать строку посимвольно справа налевоНадо не "смещать строку", а "копировать очередной символ или просто перемещаться к следующему".
Ну и не забыть "закрыть нулём" то, что получилось в результате копирования.
...
Рейтинг: 0 / 0
08.02.2019, 13:56
    #39771106
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать строку
Cerebrumвыдели буфер такого же размера как исходная строка и переноси в него символы по одному, проверяя их.
Если последний перенесенный символ запятая и следующий за ним - запятая, то игнорим их, до тех пор пока не встретится новый символ не запятая, либо конец строки.

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

Если могут быть кавычки непарные, то после первой обнаруженной кавычки надо смотреть вперед, есть ли у нее закрывающая. Если есть, то это парный блок, который копируется as is. Если парной нет, то дальше продолжаем переносить как и обычно.

Если память исходной строки твоя, то можно не выделять новый буфер, а просто смещать строку посимвольно справа налево, а алгоритм уже известен. Таким образом значимые символы затрут лишние запятые, "наехав" на них. Но может получиться дофига копирований хвоста строки, что может быть не очень хорошо, особенно когда строки большие. Лучше один раз выделить память и заполнять ее последовательно

оставлять, только если в парных кавычках, иначе одиночная кавычка - просто символ и запятые заменяются
...
Рейтинг: 0 / 0
08.02.2019, 13:58
    #39771108
Сисдба Мастеркеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать строку
Теоретически, кавычки могут быть еще заэкранированы.
...
Рейтинг: 0 / 0
08.02.2019, 14:01
    #39771111
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать строку
Сисдба МастеркеевичТеоретически, кавычки могут быть еще заэкранированы.

кстати, да, вариант
...
Рейтинг: 0 / 0
11.02.2019, 17:08
    #39772401
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать строку
а как сделать, чтобы результат был в той же строке, без дублирования и маллоков?
...
Рейтинг: 0 / 0
11.02.2019, 17:33
    #39772423
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать строку
Пытаюсь ту же строку изменить, чтобы не делать маллоки и т .д.
Но почему здесь exception write access:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
void check(char* s)
{
	int n1 = 0;
	int n = strlen(s);
	int j = 0;
	char* p = s;

	std::cout << "string:" << s << "\n";
	for (int i = 0; i < n; i++)
	{
		if (s[i] == ':')
			n1++;
		else
			n1 = 0;
		if (n1 > 1)
			continue;

		*p = s[i];// <---------------!
		p++;
	}
	std::cout << "string1:" << s << "\n";
}
...
Рейтинг: 0 / 0
11.02.2019, 18:19
    #39772471
Aklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать строку
Строка, передаваемая в функцию, надеюсь, не константная?
Т.е. check("abcde") ?
...
Рейтинг: 0 / 0
11.02.2019, 18:20
    #39772472
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать строку
Ролг ХупинНо почему здесь exception write access:а вызываешь как свой check?
...
Рейтинг: 0 / 0
12.02.2019, 11:44
    #39772702
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать строку
egorychРолг ХупинНо почему здесь exception write access:а вызываешь как свой check?

Код: plaintext
1.
2.
3.
4.
5.
int main()
{
    char* str = (char*)"a,z,,bb,,,cc,,,,";
    check(str);
}




Кажется понял, строка - константа, нельзя модифицировать?

( c# выравнивает извилины )
...
Рейтинг: 0 / 0
12.02.2019, 12:07
    #39772721
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработать строку
Ролг ХупинКажется понял, строка - константа, нельзя модифицировать?
Нельзя. Она хранится в readonly памяти, поэтому ошибка доступа к памяти при попытке записать.

Напиши так
Код: plaintext
1.
char str[] = "a,z,,bb,,,cc,,,,";
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Обработать строку / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]