|
Обработать строку
|
|||
---|---|---|---|
#18+
Как красиво в С сделать следующее: есть строка, надо заменить в ней в ней многократно повторяющиеся запятые (,) на одну, исключая случаи, когда они в кавычках aa,,a,,,,bbb',,' должно вернуть aa,a,bbb',,' ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2019, 13:07 |
|
Обработать строку
|
|||
---|---|---|---|
#18+
Ролг ХупинКак красиво в С сделать Цикл копирования из одного буфера в другой с простеньким конечным автоматом с состояниями "ништяк", "была запятая", "была кавычка". Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2019, 13:39 |
|
Обработать строку
|
|||
---|---|---|---|
#18+
выдели буфер такого же размера как исходная строка и переноси в него символы по одному, проверяя их. Если последний перенесенный символ запятая и следующий за ним - запятая, то игнорим их, до тех пор пока не встретится новый символ не запятая, либо конец строки. С кавычками сложнее, но тут зависит от того могут ли они быть непарными или только строго парными. Если строго парные, то при переносе отлавливаем момент открытия кавычек и копируем все символы до закрывающей кавычки, потом снова возобновляем перенос по алгоритму, описанному выше. Если могут быть кавычки непарные, то после первой обнаруженной кавычки надо смотреть вперед, есть ли у нее закрывающая. Если есть, то это парный блок, который копируется as is. Если парной нет, то дальше продолжаем переносить как и обычно. Если память исходной строки твоя, то можно не выделять новый буфер, а просто смещать строку посимвольно справа налево, а алгоритм уже известен. Таким образом значимые символы затрут лишние запятые, "наехав" на них. Но может получиться дофига копирований хвоста строки, что может быть не очень хорошо, особенно когда строки большие. Лучше один раз выделить память и заполнять ее последовательно ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2019, 13:50 |
|
Обработать строку
|
|||
---|---|---|---|
#18+
CerebrumЕсли память исходной строки твоя, то можно не выделять новый буфер, а просто смещать строку посимвольно справа налевоНадо не "смещать строку", а "копировать очередной символ или просто перемещаться к следующему". Ну и не забыть "закрыть нулём" то, что получилось в результате копирования. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2019, 13:54 |
|
Обработать строку
|
|||
---|---|---|---|
#18+
Cerebrumвыдели буфер такого же размера как исходная строка и переноси в него символы по одному, проверяя их. Если последний перенесенный символ запятая и следующий за ним - запятая, то игнорим их, до тех пор пока не встретится новый символ не запятая, либо конец строки. С кавычками сложнее, но тут зависит от того могут ли они быть непарными или только строго парными. Если строго парные, то при переносе отлавливаем момент открытия кавычек и копируем все символы до закрывающей кавычки, потом снова возобновляем перенос по алгоритму, описанному выше. Если могут быть кавычки непарные, то после первой обнаруженной кавычки надо смотреть вперед, есть ли у нее закрывающая. Если есть, то это парный блок, который копируется as is. Если парной нет, то дальше продолжаем переносить как и обычно. Если память исходной строки твоя, то можно не выделять новый буфер, а просто смещать строку посимвольно справа налево, а алгоритм уже известен. Таким образом значимые символы затрут лишние запятые, "наехав" на них. Но может получиться дофига копирований хвоста строки, что может быть не очень хорошо, особенно когда строки большие. Лучше один раз выделить память и заполнять ее последовательно оставлять, только если в парных кавычках, иначе одиночная кавычка - просто символ и запятые заменяются ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2019, 13:56 |
|
Обработать строку
|
|||
---|---|---|---|
#18+
Теоретически, кавычки могут быть еще заэкранированы. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2019, 13:58 |
|
Обработать строку
|
|||
---|---|---|---|
#18+
Сисдба МастеркеевичТеоретически, кавычки могут быть еще заэкранированы. кстати, да, вариант ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2019, 14:01 |
|
Обработать строку
|
|||
---|---|---|---|
#18+
а как сделать, чтобы результат был в той же строке, без дублирования и маллоков? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2019, 17:08 |
|
Обработать строку
|
|||
---|---|---|---|
#18+
Пытаюсь ту же строку изменить, чтобы не делать маллоки и т .д. Но почему здесь 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2019, 17:33 |
|
Обработать строку
|
|||
---|---|---|---|
#18+
Строка, передаваемая в функцию, надеюсь, не константная? Т.е. check("abcde") ? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2019, 18:19 |
|
Обработать строку
|
|||
---|---|---|---|
#18+
Ролг ХупинНо почему здесь exception write access:а вызываешь как свой check? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2019, 18:20 |
|
Обработать строку
|
|||
---|---|---|---|
#18+
egorychРолг ХупинНо почему здесь exception write access:а вызываешь как свой check? Код: plaintext 1. 2. 3. 4. 5.
Кажется понял, строка - константа, нельзя модифицировать? ( c# выравнивает извилины ) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2019, 11:44 |
|
Обработать строку
|
|||
---|---|---|---|
#18+
Ролг ХупинКажется понял, строка - константа, нельзя модифицировать? Нельзя. Она хранится в readonly памяти, поэтому ошибка доступа к памяти при попытке записать. Напиши так Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2019, 12:07 |
|
|
start [/forum/topic.php?fid=57&msg=39771106&tid=2017667]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 267ms |
total: | 414ms |
0 / 0 |