Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Инструментарий

Инструментарий Тестеры, паяльники, осциллографы, программаторы, IDE.

Ответ
 
Опции темы Опции просмотра
Старый 16.01.2017, 18:49   #1
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,893
Вес репутации: 5611/171
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Си, сравнить строку с маской

маска вида
* - любое количество (в т.ч. 0) любых символов
? - одиночный символ.
все, что не '*' и '?' - собственно символы

критерий - минимальный размер, и использовать, что есть в <string.h>
Где можно посмотреть, как сделать красиво?

собственно заcада с '*' - там какая-то жесткая рекурсия должна получаться...
Greg вне форума   Ответить с цитированием
Старый 17.01.2017, 09:13   #2
yeskela
Senior Member
 
Аватар для yeskela
 
Регистрация: 28.01.2010
Адрес: Новочеркасск
Возраст: 37
Сообщений: 1,129
Вес репутации: 3762/85
yeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond repute
По умолчанию Re: Си, сравнить строку с маской

А регулярка статически задана? Если да, может погуглить лексические генераторы для с? Которые генерят код разбора конкретного шаблона.
__________________
Отсутствие доступа в интернет с рабочего места очень замедляет работу. Наличие - полностью парализует её.
yeskela вне форума   Ответить с цитированием
Старый 18.01.2017, 20:26   #3
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,893
Вес репутации: 5611/171
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: Си, сравнить строку с маской

Цитата:
Сообщение от yeskela Посмотреть сообщение
А регулярка статически задана? Если да, может погуглить леtксические генераторы для с? Которые генерят код разбора конкретного шаблона.
да... лексические генераторы - это прям индустрия какая-то (много всего, и коммерческого и просто). видимо, кем-то востребовано.
но это как-то не то.

выкинул '?' (я ее сам и придумал) и все упростилось до пяти строчек.
вообще детская какая-то тема, но вот оказалось нужно...

Код:
char token[TOK_NUM][TOK_SZ];    // array for tokens.
const char tokd[] = "*";   // token delimiter 

/////////////////////////////////
// compare string with a mask
// return 0 if success
// else return error code
//////////////////////////////////
/////////////////////////////////

int str_cmp_mask (char * maskstr, char * str2) {
  
  char *td;    // так надо
  int token_num = 0;  // number of parsed tokens  

// здесь можно проверить на ненулевость входных строк
// и случай когда в маске   одни звезды

 
 // look for tokens with '*' delimiter

  td = strtok(&maskstr[0], &tokd[0]);
  
  while (td != NULL) {
    
    if (TOK_NUM == token_num)
      return (4);                 // too many tokens discovered
    
    strncpy (token[token_num++], td, TOK_SZ);
    td = strtok (NULL, tokd);
  }
  
  if (token_num == 0) {    // а вдруг?
    return (3); 
  }
  
// сравнение строки с токенами
  int idx = 0;
  td = &str2[0];
  
  do {
    // process tokens
    td = strstr(td, token[idx]);
    if (td == NULL) {
      return (5 + idx);           // no such token inside string
    }
    td += strlen (token[idx++]);
  } while (--token_num);
  
  return (0);
}
Greg вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов финкции Си из ассемблера Maguark Вопросы начинающих 0 10.01.2014 13:09
Преобразовать 2 байта данных -> число -> строку, вывести на жки (на си) Den_GF5 Вопросы начинающих 24 17.02.2010 23:35
Из асма в Си Mic54 Вопросы начинающих 30 24.11.2008 18:42


Часовой пояс GMT +3, время: 15:53.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot