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

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

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

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

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

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

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

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

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

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

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

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

кстати, да, вариант
...
Рейтинг: 0 / 0
Обработать строку
    #39772401
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как сделать, чтобы результат был в той же строке, без дублирования и маллоков?
...
Рейтинг: 0 / 0
Обработать строку
    #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
Обработать строку
    #39772471
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Строка, передаваемая в функцию, надеюсь, не константная?
Т.е. check("abcde") ?
...
Рейтинг: 0 / 0
Обработать строку
    #39772472
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинНо почему здесь exception write access:а вызываешь как свой check?
...
Рейтинг: 0 / 0
Обработать строку
    #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
Обработать строку
    #39772721
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинКажется понял, строка - константа, нельзя модифицировать?
Нельзя. Она хранится в readonly памяти, поэтому ошибка доступа к памяти при попытке записать.

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


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