2010年10月13日水曜日

strtok

ちょっと前に、C言語でstrtokという関数を使うことがあったので、少々。
なんでこれを使おうかと思ったかてーと、
文字列の分割をやりたかったんですが、Cにはspritなるものが無い。
というわけでどうにかしてできないものかと、(今思えばC++にしてしまってそっちでboostとか使えばよかったかなあなんて思ったりすることもありますが…)
一生懸命探して、たどり着いたのがこのstrtok!
まあどんな関数かというのはググってみればわかるので割愛。

まあ、文字列を分割するわけですよ。
でも、perlのsplitみたいに

#!/usr/local/bin/perl

my $str = "110.12.133.1";
my @ip = sprit($str);

ってすると配列に順序よく入ってくれるなんてことはない。
まずこのstrtok
与えられた文字列から対象の文字があったところに¥0を挿入する。
そして、そのポインタを返却します。
まあ下の例をみてもらうとわかるかと。

#include <stdio.h>
#include <string.h>

void echo(int len, char str[]) {
    int i = 0;
    for(i = 0; i < len ; i++ ) {
        printf("%02x ", str[i]);
        if(i == len -1) printf("\n");
    }
}

int main() {
    char str[] = "110.12.133.1/24";
    char *tp;

    printf("START ECHO\n");
    int len = strlen(str);
    echo(len, str);
    tp = strtok( str, "./" );
    //printf("%s\n", tp);
    while ( tp != NULL ) {
        tp = strtok( NULL," ./" );
        //if ( tp != NULL ) printf("%s\n", tp);
    }
     
    printf("END ECHO\n");
    echo(len, str);
    return 0;
}

文字列「110.12.133.1/24」を「.」「/」で分割してるコード。
実行結果は、
sono106$ ./a.out 
START ECHO
31 31 30 2e 31 32 2e 31 33 33 2e 31 2f 32 34 
END ECHO
31 31 30 00 31 32 00 31 33 33 00 31 00 32 34 
2eと2fのところに00と入ってるのがお分かりでしょう。
こんな感じで、strtokが文字列をいじっちゃってるわけです。

でもまあ、こんなコード
危険ですね。
普通strlenしてforでまわすならおそらく、「31 31 30」で出力が止まるはずです。
strlenはそこまでの長さしか出してこないと思います。

とまあ、結局何が言いたいかよくわからない感じになりましたが、
strtokよかったら使ってみてください。

0 件のコメント:

コメントを投稿