Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2022, 16:39   #1
Салага
Пользователь
 
Регистрация: 03.03.2018
Сообщений: 17
По умолчанию Подсчёт разделителей

Здравствуйте.

Есть простая функция, которая обрабатывает строчку по сепараторами > и вытаскивает подстроки адреса
Формат строки - "Country>City>Street>Aprts"
Первым делом мы проверяем, что формат строки соответствует, т.е. сепараторов 4 штуки

Код:

for( i = 0; i < strlen(address); i++ )
{
    if( address[i] == '>' )
        sep++;
}

if( sep != 4)
    printf("Bad format\n");
Тут столкнулись с ситуацией, когда в подполе Street нам помимо букв прислали разделитель, т.е.
Country>City>Str>eet>Aprts

В итоге адрес не разобрали, тк посчитали строчку с неправильным форматом.
Отправителю ничего не предъявишь, такая уж у него улица получилась...

Договорились при сборке строки с адресом экранировать символом $ те галки, которые за разделители считать не стоит, т.е.
"Country>City>Str$>eet>Aprts"

И переделали на скорую руку цикл с подсчётом разделителей на

Код:
for( i = 0; i < strlen(address); i++ )
{
    if( address[i] == '>' && i > 0 && > address[i-1] != '$' )
        sep++;
}
Но тут вылезла другая проблема, пришла строчка со всеми пустыми подполями, т.е. просто 4 сепаратора ">>>>"

Старый цикл это бы осилил, а новый нет, т.к. начинает проверять строку со второго символа

Подскажите, пожалуйста, возможный вариант решения.
Проверку на количество сепараторов убирать нельзя. Нужно именно цикл написать, чтобы осилял оба случая. Можно изначальное решение с экранированием переделать, но ничего в голову не приходит пока...
Салага вне форума Ответить с цитированием
Старый 06.05.2022, 16:48   #2
ForenLi
Форумчанин
 
Регистрация: 02.06.2021
Сообщений: 515
По умолчанию

Код:
address[i] == '>' && ( i == 0 || address[i-1] != '$' )
ForenLi вне форума Ответить с цитированием
Старый 06.05.2022, 16:49   #3
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
if (address[0] == '>') sep++;
for( i = 1; i < strlen(address); i++ )
{
    if( address[i] == '>' && > address[i-1] != '$' )
        sep++;
}
Так меньше лишних действий в цикле
macomics вне форума Ответить с цитированием
Старый 06.05.2022, 20:03   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Цитата:
Сообщение от Салага Посмотреть сообщение
т.е. сепараторов 4 штуки
А в формате строки их три.
Цитата:
Сообщение от macomics Посмотреть сообщение
Так меньше лишних действий в цикле
А если строка пустая?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.05.2022, 20:15   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
А если строка пустая?
Это все равно не нужно проверять в цикле.
Код:
int len = strlen(address);
if (len > 0 || address[0] == '>') sep++;
for( i = 1; i < len; i++ )
{
    if( address[i] == '>' && > address[i-1] != '$' )
        sep++;
}
Но вытащить вызов функции из условия цикла тоже отличная идея.
macomics вне форума Ответить с цитированием
Старый 08.05.2022, 08:13   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Начинайте с нуля и после проверки сохраняйте последний символ, который прочитали.
Каждый раз дойдя до сепаратора просто проверьте был ли предыдущий символ символом экранирования.
waleri вне форума Ответить с цитированием
Старый 08.05.2022, 10:18   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Начинайте с нуля и после проверки сохраняйте последний символ, который прочитали.
Каждый раз дойдя до сепаратора просто проверьте был ли предыдущий символ символом экранирования.
Опять лишние манипуляции добавлять в цикл
macomics вне форума Ответить с цитированием
Старый 08.05.2022, 17:45   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Опять лишние манипуляции добавлять в цикл
Ну не добавляйте...
waleri вне форума Ответить с цитированием
Старый 13.05.2022, 01:22   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
if (len > 0 || address[0] == '>') sep++;
Все-таки лучше логическое И.
Цитата:
Сообщение от Салага Посмотреть сообщение
&& >
Лишнее Больше затесалось.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 13.05.2022, 02:31   #10
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Все-таки лучше логическое И.
Моя очепятка, спасибо за поправку.
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
StrToDate по формату без разделителей - возможно? Ship_1 Общие вопросы Delphi 3 04.05.2017 12:07
Выгрузка из Эксель в текстовый документ без разделителей... igoryava Microsoft Office Excel 19 24.03.2015 13:44
Ввод строк и массива разделителей AdelinaMango Общие вопросы C/C++ 1 06.04.2014 15:58
порядок разделителей губка Паскаль, Turbo Pascal, PascalABC.NET 2 26.09.2011 12:06
Ввод даты без разделителей (311007) avtor101 Microsoft Office Excel 1 31.10.2007 19:57