大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

C++でC風ライブラリを作る(文字列コピー編)

著者:高木信尚
公開日:2019/06/09
最終更新日:2019/06/27
カテゴリー:技術情報

高木です。こんばんは。

なんか久しぶりですが、「C++でC風ライブラリを作る」もまだまだ続きますよ。
今回は文字列のコピーを行う関数を作成します。

Cで文字列をコピーする関数といえばstrcpy関数ですね。
ほかにはstrncpy関数もありますし、BSD系の処理系にはstrlcpy関数もあります。
sprintf関数やsnprinf関数を文字列のコピーに使うこともできます。

また、ワイド文字列のコピーのためにwcscpy関数やwcsncpy関数もあります。
swprintf関数もありますね。

それぞれの関数には特徴があって、よく似ているようで微妙に仕様が異なっています。

strcpy関数は結果を格納する配列のサイズがわからないので、簡単に不正なメモリアクセスを起こしてしまいます。
strncpy関数は結果を格納するサイズを指定するのですが、コピー元の文字列が短い場合は残りの領域にナル文字を書き込みます。
逆に、コピー元の文字列の長さが指定したサイズと同じ場合には末尾にナル文字が書き込まれません。

ナル文字で終端しない文字列ができてしまうのは問題につながることも多いため、BSD系の処理系には末尾にナル文字を書き込むことを保証するstrlcpy関数があります。
これは便利ですが、特定の処理系でしか使えないので移植性に問題があります。

sprintf関数も結果を格納する配列のサイズを指定できません。
しかし、書式指定子で”%.8s”のようにすることで、書き込む文字列の最大長を指定することができます。
“%.*s”のようにすれば、実引数で最大長を指定することもできます。

snprintf関数はすべての問題を解決してくれそうで、結果の格納先の配列のサイズを指定できますし、sprintf関数と同様、書式指定子で文字列の最大長を指定することも可能です。
ただし、決して軽量とはいえないのが難です。

これらを踏まえ、今回はサイズ指定可能なstrcpy関数とstrncpy関数をC++で再実装することにします。
snprintf関数はもともと文字列をコピーするためのものではありませんので、別の機会に譲ることにしましょう。

まずはstrcpy関数からです。

次にstrncpy関数です。

とりあえず今回は、単純な文字配列を使ったstrcpy関数とstrncpy関数だけを作ってみました。
正直、何の面白みもないシンプルな実装です。
もう少し頑張ることもできるのですが、今回はシンプルなものを目指していますのでこんな感じにしておきます。

次回はstd::basic_stringクラステンプレートを絡めた形で、これらの関数を拡張することにします。

    上に戻る