Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Библиотека C string.h


Автор: anthony 1.8.2007, 09:56
Краткое описание

Предлагается вариант реализации ряда функции стандартной библиотеки С, описанных в заголовочном файле http://www.cplusplus.com/reference/clibrary/cstring/.

На реализацию накладывается ряд ограничений, в частности, предпочтение отдается:
  • использованию указателей (использование индексации нежелательно);
  • минимизации кода по размеру, количеству используемых переменных и так далее;
  • учету приоритетов, неявных преобразований и так далее.


Предлагаемый материал используется в обучающих целях.

Ожидается:
  • ссылки на имеющиеся исходные коды реализации функций (или сами исходные коды);
  • помощь в отладке и улучшении функций;
  • помощь в проверке функции на соответствие стандарту.
P.S. В данном случае речь идет именно о С, поэтому при компиляции используйте компилятор С (или режим компиляции С для компиляторов С++).

Функции

strlen
Код

size_t sample_strlen ( const char *string ) {
    const char *string_end = string;
    while ( *string_end++ );
    return ( string_end - string - 1 );
}



strcpy
Код

char *sample_strcpy ( char *destination, const char *source ) {
    char *result = destination;
    while ( *destination++ = *source++ );
    return result;
}


strncpy
Код

char *sample_strncpy ( char *destination, const char *source, size_t number ) {
    char *processed = destination;
    while ( number && ( *processed = *source ) ) {
        --number;
        ++processed;
        ++source;
    }
    while ( number ) {
        --number;
        *processed++ = 0;
    }
    return destination;
}


strcmp
Код

char sample_strcmp ( const char *first, const char *second ) {
    while ( *first && *first == *second ) {
        ++first;
        ++second;
    }
    return *first - *second;
}


strchr
Код

char *sample_strchr ( const char *string, int character ) {
    while ( *string && *string != character  ) {
        ++string;
    }
    return *string ? string : NULL;
}


strstr
Код

char *sample_strstr ( const char *string, const char *pattern ) {
    const char *processed = pattern;
    while ( *string ) {
        processed = pattern;
        while ( *processed && *string == *processed ) {
            ++string;
            ++processed;
        }
        if ( !*processed ) {
            return string - ( processed - pattern );
        }
        ++string;
    }
    return NULL;
}


Несмотря на то, что функция получает указатели на константные строки, возвращается указатель на не константную строку (см. K&C Ansi C приложение Б.3).

Автор: bsa 1.8.2007, 10:17
http://www.gnu.org/software/libc/libc.html
http://www.fefe.de/dietlibc/
Вообще-то данные библиотечные функции давно созданы, оптимизированы, отлажены и переделывать их смысла нет никакого.

Автор: anthony 1.8.2007, 10:29
bsa, Вы наверное невнимательно прочитали написанное выше, поэтому повторю:

Предлагаемый материал используется в обучающих целях.

Мне не нужна собственная стандартная библиотека, но мне нужна реализация ряда функций, которая удовлетворяет довольно жестким требованиям как техническим (выше) так и требованиям стиля, удобочитаемости и так далее. Кроме того, каждая функция должна быть независимой от других, а оптимизация не ставится в вершину угла.

Я не могу согласиться что http://www.fefe.de/dietlibc/:

Код

char *strstr(const char *haystack, const char *needle) {
  size_t nl=strlen(needle);
  size_t hl=strlen(haystack);
  int i;
  if (!nl) goto found;
  if (nl>hl) return 0;
  for (i=hl-nl+1; __likely(i); --i) {
    if (*haystack==*needle && !memcmp(haystack,needle,nl))
found:
      return (char*)haystack;
    ++haystack;
  }
  return 0;
}


Может использоваться в обучающих целях.

Автор: JackYF 1.8.2007, 12:19
Цитата(bsa @  1.8.2007,  10:17 Найти цитируемый пост)
Вообще-то данные библиотечные функции давно созданы, оптимизированы, отлажены и переделывать их смысла нет никакого. 

+1.

Цитата(anthony @  1.8.2007,  10:29 Найти цитируемый пост)
Может использоваться в обучающих целях. 

а какие обучающие цели может решить предоставление человеку набора готовых функций? если человек учится, пусть пишет сам, вооружившись хотя бы тем же K&R.

Автор: Rockie 1.8.2007, 14:54
Для VS2005 эти функции можно найти в папке ..\VS2005\VC\crt\src\



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)