C99に対応した標準Cライブラリの実装レポートを行っていきます。

プロフィール 

Author:高木信尚

ホームページ
ブログ

最近の記事 

最近のコメント 

最近のトラックバック 

月別アーカイブ 

カテゴリー 

ブロとも申請フォーム 

この人とブロともになる

ホーム 全記事一覧 << 前の記事 次の記事 >>

 

2008/10/07 11:47|

 

<string.h>には、strcoll関数の他にもうひとつロケールに依存する関数が宣言されます。それが、strxfrm関数です。この関数は何をするかというと、ナル終端文字列をロケールに応じて変換し、strcmp関数で単純比較すれば、元の文字列を直接strcoll関数で比較したのと同じ結果になるようにするものです。

strxfrm関数はsize_t型の返却値を返しますが、この値は変換後の文字列の長さを意味します。変換用のバッファが足りなくても、変換後の長さを返しますので、いったん必要な配列のサイズを調べてから、改めて変換するような使い方もできます。

strcoll関数もそうであったように、とりあえずは"C"ロケールしか扱いませんので、今回は暫定実装のみにしておきます。

#include <string.h>

size_t strxfrm(char * __restrict__ s1, const char * __restrict__ s2, size_t n)
{
  size_t result = strlen(s2);
  if (n != 0) {
    if (result < n)
      strcpy(s1, s2);
  }
  return result;
}

strncpy関数ではなく、長さを調べてからstrcpy関数を使っているのは、strncpy関数は配列のサイズ一杯までナル文字を埋める仕様になっていますが、strxfrm関数は最初のナル文字以降に書き込んではいけないからです。
ナル文字を書き込んでいない不具合があったので、修正しました。

それはそうと、memcpy関数はまだ取り上げていませんでした。順序がバラバラですが、次回はmemcpy関数を取り上げたいと思います。
最初はmemcpyを使っていましたが、不具合を修正しているうちに、memcpyがなくなってしまいました。
2006/03/15 00:38|文字列操作TB:0CM:4

コメント

strxfrm関数は、変換先のバッファが十分あれば、
ナル文字終端文字列を書き込むはずだけど、この実装ではナル文字を書き込んでいない。
マイケル #-|2006/03/15(水) 23:53 [ 編集 ]


ご指摘ありがとうございます。
暫定実装なので、手を抜いてしまいました。
おっしゃるとおりでした。
たかぎ #ftr86F3A|2006/03/16(木) 00:09 [ 編集 ]


> if(n < result)
これだと、n == resultのとき、ナル文字分だけ、
バッファオーバーフローする。
if(n <= result)
にしないといけない。
もしくは、バッファが足りないとき、変換先の内容は不定だから、書き込む必要もないと思う。
マイケル #-|2006/03/16(木) 17:45 [ 編集 ]


再度ご指摘ありがとうございます。

> もしくは、バッファが足りないとき、変換先の内容は不定だから、書き込む必要もないと思う。

いわれてみればその通りです。
ちょっと手抜きがきつかったので、今後は暫定のものも時間をかけて取り組みます。
たかぎ #ftr86F3A|2006/03/16(木) 18:03 [ 編集 ]

コメントの投稿

管理者にだけ表示を許可する


トラックバック
トラックバックURLはこちら
http://libc.blog47.fc2.com/tb.php/36-44f682b2

ホーム 全記事一覧 << 前の記事 次の記事 >>

ブログ内検索 

お勧め書籍 

RSSフィード 

リンク 

このブログをリンクに追加する

Powered By FC2ブログ 

Powered By FC2ブログ
ブログやるならFC2ブログ

Copyright(C) 2006 TAKAGI Nobuhisa All rights reserved.
Powered by FC2ブログ. 無料ホームページ アフィリエイト レンタルサーバー FC2ブログ 一戸建て template designed by 遥かなるわらしべ長者への挑戦.