Какие сторонние варианты существуют для работы со строками в C?

Некоторое время я знал, что я код примерно на 17 раз быстрее на Python, чем на C, и я предполагаю, что я предполагаю, что я не был программистом, пока я действительно не подумал об этом, и понял, что единственная проблема заключается в том, что я могу ‘t обрабатывать строки C / массивы символов / указатели символов / что угодно. У меня есть блок о них, и манипулирование ими занимает много часов. У меня нет этой проблемы на C ++.

Но жизнь заставляет меня кодировать в чистом C на данный момент, и я пытаюсь найти, есть ли какая-то сторонняя библиотека, которую я могу добавить, что облегчит мою жизнь. Я сделал несколько поисковых роботов, и я не очень много нашел. Я начинаю рассматривать это самостоятельно, но мне кажется, что я изобретаю колесо. Неужели что-то есть? Кто-нибудь знает что-то подобное? Что-то, что делает C более похожим на C ++ в этом отношении. Я понимаю, что это глупая идея, так как это точка C ++, но вы понимаете, я уверен.

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

http://developer.gnome.org/glib/2.34/glib-utilities.html

http://developer.gnome.org/glib/2.34/glib-Strings.html

Это основа гнома, но вы можете использовать его независимо от гнома, я думаю. Согласно обзорной странице «Он работает на многих платформах, подобных UNIX, а также Windows и OS X».

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

Есть несколько важных вещей, которые вы должны изучить и понять, чтобы написать правильный C-код, содержащий указатели / массивы / строки:

  1. Объявления указателей, массивов, указателей на указатели, указатели на массивы, массивы массивов, массивы указателей и т. Д. И т. Д. C декларации действительно странные для непосвященных. Но они доступны для изучения, и есть некоторые инструменты, такие как cdecl которые могут быстро переводить объявления abracadabrish на простой английский или наоборот.
  2. Если вы видите, что функция объявляет один из своих параметров как массив (например, void f(int a[]) ), не верьте своим глазам. Это указатель, а не массив. В C массивы никогда не передаются как аргументы функции. Передаются только указатели. Синтаксис обманчив, и создатели C жаловались на такие вещи, но это история. Вы не можете его изменить.
  3. Во всех выражениях C (не путать с объявлениями и определениями), кроме одного, массивы ведут себя как указатели на их первый элемент. Исключением является оператор sizeof . sizeof(array) вернет вам истинный размер массива в chars . Но как только вы делаете sizeof(array+0) , вы преобразовали array в выражение типа указателя, указывающего на array[0] и в этом случае sizeof вернет вам размер указателя.
  4. Вы не можете назначать массивы. Вы можете инициализировать их, когда вы их определяете, вы можете их скопировать, но не назначать с = после того, как они были определены.
  5. В C нет строчек в виде фундаментального типа. Есть только chars , массивы chars и указатели на chars и указатели на массивы chars и мы часто ссылаемся на все их как строки, но на самом деле это не так. То, что вы видите в виде строки, например: "I am a string. Or maybe I'm not." называется строковым литералом, и где-то есть массив связанных с ним chars . Я говорю где-то, потому что строковый литерал ведет себя по-разному в разных контекстах. Во всех выражениях C (не путать с объявлениями / определениями), кроме одного, строковые литералы ведут себя как указатель на первый char массива, содержащий текст литерала. Исключением является, опять же, sizeof . Он вернет вам размер базового массива chars в виде sizeof("ABC") . Опять же, как и с массивами, в момент, когда вы пишете sizeof("ABC"+0) , вы преобразовали "ABC" в указатель на char а sizeof вернет вам размер указателя.
  6. Вы не должны пытаться модифицировать массивы char созданные строковыми литералами: "ABC"[0] = 'Z'; это неопределенное поведение. И так char* p = "ABC"; p[0] = 'Z'; char* p = "ABC"; p[0] = 'Z'; или эквивалентный char* p = "ABC"; *p = 'Z'; char* p = "ABC"; *p = 'Z'; ,
  7. Вы можете использовать строковые литералы для инициализации массивов chars или указателей на chars (вы также можете назначать строковые литералы указателям, но не массивам, массивы не могут присваиваться, как указывалось ранее). Что происходит, зависит от того, что вы инициализируете. В char a[] = "Hello"; или в char a[] = { "Hello!" }; char a[] = { "Hello!" }; вы создаете массив chars и вы устанавливаете его содержимое как текст в строковом литерале. После этого вы можете изменить этот массив. В char* p = "World!"; вы создаете массив char содержащий текст литеральной строки, и вы создаете указатель на char указывающий на первый char этого массива. В этом случае вы не можете изменить массив, как я указывал ранее.
  8. Два или более смежных строковых литерала, разделенных пробелом, объединяются в один: "Hello" " World!" это то же самое, что "Hello World!" ,
  9. Там также указатель арифметики, но это легко.

Это об этом. Основные декларации, мастер-массивы в выражениях и функциональных параметрах, смотрите строковые литералы.

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