C++でCGIを

文字列を扱う

便利なstring

STLの一部として、string クラスがあります。

これは、従来 char 配列で表現していた文字列を、長さや文字の参照を管理し、連結や部分取りだしなどを可能にしたクラス、という感じです。

Visual C++ の CString や、Borland C++ Builder の AnsiString を使っていると、非常に便利でありがたく思うのですが、これを環境を越えて使えるようにしたもの (ただし、実装系が違うと値の直接渡しはできないと思いますが) が、string です。

演算子のオーバーロードにより、データが直感的に扱えるようになっています。もちろん、データ部分の核は、char 配列ですから、従来のプログラムとの互換性も簡単にとれます。

使い方としては

// 初期化
string str = "This is a test.";        // str を文字配列 "This is a test." で初期化
str.assign(carray);                    // str を文字配列 carray で初期化

// 追加
str = str + anystr;                    // str に文字列 anystr を付け足す
str.append("something");               // str に "something" という文字列を付け足す

// 長さ
unsigned int len = str.length();                // 文字列 str の長さを求める
str.resize(str.length() * 2);          // 文字列 str の長さを2倍にする

// 挿入
str.insert(pos, "insert it.");         // 位置 pos に文字配列 "insert it." を挿入

// 検索
unsigned int comma_pos = str.find('.');         // 文字 '.' を探す

// 部分文字列
string partial = str.substr(0, 5);     // 0文字目から 5文字取り出す

// 従来の文字配列
char* cdata = str.c_str();            // 従来の文字配列にアクセス

などとします。

正規表現

CGI でよく使われる Perl の究極的な強みは、正規表現です。

従来使われていた C や C++ ではできない、この文字列処理を、いとも簡単にやってのける Perl は、その速度的な問題にも関わらず、すぐに CGI プログラミングの標準となりました。

そう、Perl は遅いのです。インタプリタ言語(今風に言うとスクリプト言語…?)ですから。

C++でも正規表現が可能になれば、もっと使いやすくなるはずです。Perlよりも遙かに高速に動作するでしょう。

C++での正規表現実装は、別ページに置きます。