なんでこれを使おうかと思ったかてーと、
文字列の分割をやりたかったんですが、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>文字列「110.12.133.1/24」を「.」「/」で分割してるコード。#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; }
実行結果は、
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 342eと2fのところに00と入ってるのがお分かりでしょう。
こんな感じで、strtokが文字列をいじっちゃってるわけです。
でもまあ、こんなコード
危険ですね。
普通strlenしてforでまわすならおそらく、「31 31 30」で出力が止まるはずです。
strlenはそこまでの長さしか出してこないと思います。
とまあ、結局何が言いたいかよくわからない感じになりましたが、
strtokよかったら使ってみてください。
0 件のコメント:
コメントを投稿