что-то вроде «расширенной» библиотеки C-строк? - PullRequest
12 голосов
/ 08 июня 2011

Я использовал несколько динамически типизированных языков, и я избегал C, но достаточно достаточно, иногда это правильный инструмент для работы, и мне нужно преодолеть его.

Вещи, которые мне не хватает в работе с Cассоциативные массивы и большие строковые библиотеки.Есть ли библиотека, которая дает больше параметров, чем string.h?Любой общий совет, когда дело доходит до перехода со строками?

Спасибо за чтение-Патрик

Ответы [ 7 ]

7 голосов
/ 08 июня 2011

Вы можете взглянуть на Better String Library .Описание с сайта:

Better String Library - это абстракция строкового типа данных, который превосходит строковый тип буфера символов библиотеки C или std :: string в C ++.Среди достигнутых функций:

  • Существенное уменьшение проблем переполнения / переполнения буфера и других сбоев, вызванных ошибочным использованием общих функций библиотеки строк C
  • Значительно упрощенное манипулирование строками
  • Высокая производительность взаимодействия с другими источниками / библиотеками, которые ожидают окончания символьных буферов '\ 0'
  • Улучшенная общая производительность общих строковых операций
  • Функциональная эквивалентность с другими более современными языками

Библиотека полностью автономна, переносима (известно, что она работает с gcc / g ++, MSVC ++, Intel C ++, WATCOM C / C ++, Turbo C, Borland C ++, встроенным компилятором IBM CC для Windows, Linux и Mac OS.X), высокая производительность, простота в использовании и не является частью какой-либо другой коллекции структур данных.Даже файловые функции ввода / вывода полностью абстрагированы (так что можно использовать другие потоковые механизмы, такие как сокеты). Тем не менее, этого достаточно в качестве полной замены библиотеки C-строк для манипулирования строками в любой C-программе.

2 голосов
/ 08 июня 2011

GLib предоставляет множество готовых структур данных и функций обработки строк, но это набор функций и типов, полностью отделенных от "обычных", и это не очень легкая зависимость.

Если вместо этого C ++ является жизнеспособной альтернативой для вашей задачи, он объединяет строковый класс и несколько универсальных контейнеров, уже готовых в стандартную библиотеку (и многое другое можно найти в Boost).

1 голос
/ 08 июня 2011

POSIX дает вам <string.h>, <strings.h> и <regex.h>.Если вам действительно нужно больше библиотеки строк, чем эта, C, вероятно, не подходит для этой конкретной работы.

Что касается хеш-таблицы, вы не можете получитьбезопасная хеш-таблица в C без множества неприятных макросов.Если у вас все в порядке с сохранением void -показателей или с выполнением некоторой ручной работы для каждого типа карты, то у вас не должно быть недостатка в опциях.Кодирование вашей собственной хеш-таблицы занимает много времени - просто найдите в Stackoverflow справку по хеш-функции.Если вы не хотите бросать свои собственные, strmap [LGPL] выглядит прилично.

1 голос
/ 08 июня 2011

Большая часть силы C состоит в возможности прямого управления памятью в виде последовательности байтов. Это немного противоречит философии языка - считать строки чем-то более высоким, чем это.

Я бы порекомендовал прокатить свой самый простой. Это будет полезный опыт, особенно для изучения арифметики указателей и циклов.

Например, узнайте о «Алгоритме Шлемеля-маляра» относительно strcat и спроектируйте свою библиотеку для решения этой проблемы.

1 голос
/ 08 июня 2011

Что конкретно вы ищете в своей расширенной библиотеке c-string?

Один из способов стать лучше в C - это создать собственную библиотеку c-string. Затем сделайте его открытым исходным кодом, и пусть другие помогут уточнить его.

Я обычно не сторонник создания ваших собственных строковых библиотек, но w.r.t. C, это отличный способ выучить C.

0 голосов
/ 08 июня 2011

Ассоциативный массив, связывающий строковые ключи и значения структуры в C, состоит из:

  • Хеш-функция для строк
  • Массив с простым числом элементов, внутри каждого из которыхявляется заголовком связанного списка.
  • Элементы связанного списка, содержащие char * указатели на сохраненные ключи и (необязательно) указатель struct * на соответствующее значение для каждого ключа.

Чтобы сохранить строковый ключ в вашем ассоциативном массиве:

  • Хешируйте его по модулю этого простого массива.
  • В этом массиве добавьте его в связанный список.
  • Назначьте указатель значения добавляемому значению.
0 голосов
/ 08 июня 2011

Я сам этим не пользовался, но вам следует хотя бы просмотреть библиотеку SEI / CERT Спецификации для управляемых строк, 2-е издание .Код можно найти по адресу CERT .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...