Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Библиотека C string.h, Реализация функций работы со строками 
:(
    Опции темы
anthony
Дата 1.8.2007, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 25.6.2007
Где: Украина

Репутация: 3
Всего: 5



Краткое описание

Предлагается вариант реализации ряда функции стандартной библиотеки С, описанных в заголовочном файле string.h.

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


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

Ожидается:
  • ссылки на имеющиеся исходные коды реализации функций (или сами исходные коды);
  • помощь в отладке и улучшении функций;
  • помощь в проверке функции на соответствие стандарту.
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).

Это сообщение отредактировал(а) anthony - 1.8.2007, 10:14
PM MAIL ICQ   Вверх
bsa
Дата 1.8.2007, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



http://www.gnu.org/software/libc/libc.html
http://www.fefe.de/dietlibc/
Вообще-то данные библиотечные функции давно созданы, оптимизированы, отлажены и переделывать их смысла нет никакого.
PM   Вверх
anthony
Дата 1.8.2007, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 25.6.2007
Где: Украина

Репутация: 3
Всего: 5



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

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

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

Я не могу согласиться что реализация:

Код

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;
}


Может использоваться в обучающих целях.
PM MAIL ICQ   Вверх
JackYF
Дата 1.8.2007, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



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

+1.

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

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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Rockie
Дата 1.8.2007, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Для VS2005 эти функции можно найти в папке ..\VS2005\VC\crt\src\





--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0645 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.