2

PythonではCよりも約17倍高速にコーディングしていることをしばらく前から知っていました。実際に考えて、唯一の問題は私ができることだと気付くまで、私はプログラマーではなかったと思います。 C文字列/char配列/charポインタ/何でも処理しません。私はそれらについてブロックを持っています、そしてそれらを操作することは私に何時間もかかります。C++ではこの問題は発生しません。

しかし、人生は今のところ純粋なCでコーディングすることを余儀なくされており、私の人生を楽にするサードパーティのライブラリを追加できるかどうかを調べようとしています。グーグルをしましたが、あまり見つかりませんでした。自分で作ることを考え始めていますが、車輪の再発明をしているような気がします。確かにそこに何かがありますか?誰かがそのようなことを知っていますか?その点でCをC++に少し似たものにします。それがC++のポイントなので、それはばかげた考えだと思いますが、あなたは理解していると思います。

4

4 に答える 4

5

Better String Libraryがあります。これは、標準のC文字列処理に関する問題の多くを回避しようとする「文字列」を操作するための純粋なCライブラリです。

于 2012-10-04T00:24:39.427 に答える
3

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

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

これはgnomeの基盤ですが、gnomeとは独立して使用できると思います。概要ページによると、「WindowsやOS Xだけでなく、多くのUNIXライクなプラットフォームでも動作します。」

于 2012-10-04T00:27:37.320 に答える
2

SOの関連する質問を読むことで、ポインタ/配列/文字列の問題の解決を開始できます。そのような質問に事欠くことはありません。

ポインタ/配列/文字列を含む正しいCコードを作成するために、学習して理解する必要のある重要なことがいくつかあります。

  1. ポインター、配列、ポインターへのポインター、配列へのポインター、配列の配列、ポインターの配列などの宣言。C宣言は、初心者には本当に奇妙です。cdeclしかし、それらは学習可能であり、 abracadabrish宣言を平易な英語またはその逆にすばやく翻訳できるようなツールがいくつかあります。
  2. 関数がそのパラメーターの1つを配列(例void f(int a[]))として宣言していることがわかった場合は、目を信じないでください。これはポインタであり、配列ではありません。Cでは、配列が関数の引数として渡されることはありません。ポインタのみが渡されます。構文は欺瞞的であり、Cの作成者はこのようなことについて申し訳ありませんでしたが、これですべての歴史になりました。変更することはできません。
  3. すべてのC式(宣言および定義と混同しないでください)では、約1つを除いて、配列は最初の要素へのポインターとして動作します。例外はsizeof演算子です。sizeof(array)で実際の配列サイズを返しますchars。しかし、実行した瞬間に、を指すポインタ型の式にsizeof(array+0)変換され、この場合はポインタのサイズが返されます。arrayarray[0]sizeof
  4. 配列を割り当てることはできません。それらを定義するときに初期化することができ、それらをコピーすることはできますが、それらを定義した=後に割り当てることはできません。
  5. Cには、基本型の形式の文字列はありません。charsの配列との配列、およびの配列へのポインタcharsのみがあり、それらすべてを文字列と呼ぶことがよくありますが、実際にはそうではありません。たとえば、文字列として表示されるものは文字列リテラルと呼ばれ、どこかにそれに関連付けられた配列があります。文字列リテラルはコンテキストによって動作が異なるため、どこかで言います。すべてのC式(宣言/定義と混同しないでください)では、約1つを除いて、文字列リテラルは、リテラルのテキストを含む配列の最初のポインタとして動作します。例外は、ここでもです。基になる配列のサイズが次のように返されますcharschars"I am a string. Or maybe I'm not."charscharsizeofcharssizeof("ABC")。繰り返しになりますが、配列の場合と同様に、を記述した瞬間に、へのポインタに変換sizeof("ABC"+0)され、ポインタのサイズが返されます。"ABC"charsizeof
  6. char文字列リテラルによって作成された配列を変更しようとしないでください。これ"ABC"[0] = 'Z';は未定義の動作です。そして、char* p = "ABC"; p[0] = 'Z';または同等のものchar* p = "ABC"; *p = 'Z';です。
  7. chars文字列リテラルを使用して、の配列またはポインタを初期化charsできます(文字列リテラルをポインタに割り当てることもできますが、配列には割り当てられません。先に指摘したように、配列は割り当てられません)。何が起こるかは、初期化する内容によって異なります。char a[] = "Hello";またはでchar a[] = { "Hello!" };の配列を作成し、そのchars内容を文字列リテラルのテキストに設定します。また、必要に応じて、後でその配列を変更できます。リテラル文字列のテキストを含む配列をchar* p = "World!";作成し、その配列の最初のものを指すポインタを作成します。この場合、前に指摘したように配列を変更することはできません。charcharchar
  8. スペースで区切られた2つ以上の隣接する文字列リテラルは1つにマージされます:はと"Hello" " World!"同じ"Hello World!"です。
  9. ポインタ演算もありますが、それは簡単です。

これはそれについてです。マスター宣言、式および関数パラメーターのマスター配列は、文字列リテラルを監視します。

于 2012-10-04T01:34:09.040 に答える
0

車輪の再発明は必ずしも望ましいとは限りません。そうすることで、物事がどのように機能するかをより深く理解できると思う傾向があります。ただし、どのタイプの時間枠で作業しているかはわかりません。それ以外の場合は、別の回答で述べられているように、BetterStringLibraryは非常に優れています。

于 2012-10-04T00:27:33.747 に答える