Перейти к содержанию
    

_Bill, похоже на то, что ваш алгоритм даст неправильный ответ, если обе строки изначально тождественны. При этом, когда flash-строка дойдет до своего нуля, rеsult обнулится (сработает условие !*pp), отбросив этот вариант, как не являющийся совпадением - а это неправильно.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

_Bill, похоже на то, что ваш алгоритм даст неправильный ответ, если обе строки изначально тождественны. При этом, когда flash-строка дойдет до своего нуля, rеsult обнулится (сработает условие !*pp), отбросив этот вариант, как не являющийся совпадением - а это неправильно.

Хм... За правильность алгоритма не ручаюсь. Я только формально скорректировал существующий - заменил индексы на указатели, тип и значения вспомогательной переменной. Не более того. Возможно единственно, что может повлиять на правильность работы, так это изменение порядка проверки условия совпадения символов в строках. Тогда я неправ.

PS: Да, тут я действительно неправ. Посчитал не существенным порядок проверки.

Изменено пользователем _Bill

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Классический, писанный на 'C', strstr()

/*                      - STRSTR.C -

   The ANSI "strstr" function.

   $Revision: 38615 $

   Copyright 1986 - 1999 IAR Systems. All rights reserved.
*/

#include "string.h"

char *strstr(const char *s1, const char *s2)
{
  int n;

  if (*s2)
  {
    while (*s1)
    {
      for (n=0; *(s1 + n) == *(s2 + n); n++)
      {
        if (!*(s2 + n + 1))
          return (char *)s1;
      }
      s1++;
    }
    return NULL;
  }
  else
    return (char *)s1;
}

от него и плясать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я использую функцию которая работает одновременно со строками расположенными как в памяти программ так и в памяти данных. А для того что строки автоматически помещались во flash использую опцию компилятора --string_literals_in_flash. Из недостатков этого метода обнаружил что сама функция требует не мало памяти программ.

 

//******************************************************************************
// Функция сравнения строк
//******************************************************************************
char __generic* strstr_G(char __generic* buf, char __generic* sub)
{
 if (*sub)
 {
   while (*buf)
   {
     char __generic* bp = buf;

     do
     {
       if (!*sub) return buf;
     } 
     while (*bp++ == *sub++);
     sub -= (unsigned long) bp;
     sub += (unsigned long) buf;
     buf += 1;
   }
   return NULL;
 }
 return buf;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...