文字列のSPLITで区切り文字が連続するとき・・・

[戻る]
レン 2005/05/12(木) 00:38:39
Windows2000でVC6.0のSP6適用で使用しています。
文字列を特定の文字で分割する場合、strtokを使うのがよいとされているようですが、問題に
当たりました。
区切り文字が連続している場合、その要素を飛ばして読んでしまうのです。
例えば元の文字列が"abc\tdef\t\tghi"でstrtok("abc\tdef\t\tghi","\t")とすると@abcA
defBghiと読んでしまい、\t\tの間のNULL要素を無視してしまいます。
仕方ないので元文字列を読み、\t\tと2回続けている時はその間にスペースを入れるという新
しい文字列を作成することで読んでいます。
最終手段としてsscanfを使用してみようかと思いますが。
もっと賢い方法などありましたらどなたか教えてください。
お願いします。

REE 2005/05/12(木) 10:23:49
>仕方ないので元文字列を読み、\t\tと2回続けている時はその間にスペースを入れると
いう新
>しい文字列を作成することで読んでいます。

この処理を入れるくらいなら、strtokを使わずに自分で分割した方がよいと思われます。

AC 2005/05/12(木) 10:32:21
>文字列を特定の文字で分割する場合、strtokを使うのがよいとされているようですが
>問題に当たりました。
とあるのであえてこの方法でやっているのかもしれませんが
汎用性がなくてもいいならその部分を作ってしまってもいいかも。

  char buf[10];
  char string[] = ("abc\tdef\t\tghi");
  int len = strlen(string) +1 ;

  for(int i=0,j=0;i != len;i++) {
    if(string[i] == '\t' || string[i] == '\0') {
      strncpy(buf , &string[j] , i-j); buf[i-j]='\0';
      printf("%s\n", buf );
      j=i+1;
    }
  }
とか

#賢くないかもしれません & バグがあったらごめんなさい

AC 2005/05/12(木) 10:34:17
すみません。リロードしていませんでした。

まきじ 2005/05/12(木) 17:46:14
\t の数が固定でしたら、sscanf でいいと思います。

レン 2005/05/12(木) 22:21:29
お返事ありがとうございます。

>\t の数が固定でしたら、sscanf でいいと思います。
さまざまなCVSを別の配列のCVSに変換するソフトを作っているため固定ではなくstrtokを
使用していました。

やはり自分で作ったほうがいいですよね。
もしも手軽なものがあるなら・・・と思い質問しましたが、ありがとうございました。
ACさんもコードサンプルありがとうございます。
これからさっそく自分のコードで実験してみることにします。

レン 2005/05/13(金) 01:54:44
[[解決]]
自分で作り直したstrtok関数です。
とりあえず目的のソフトも完成し、今のところ問題なく動いています。
第一引数に大本となる文字列のポインタを指定し第二引数に区切り文字を指定します。
使い方は普通のstrtokとまったく同じでこれ以上先に要素が無ければNULLを返すようにしまし
た。
コメントくださいました皆様ありがとうございました。

char *mystrtok(char *szMoto,int c){    
    static int i;
    static char* res;
    static bool b=0;

    if(szMoto){
        i=0;
        res = szMoto;
        b=1; 
    }else{
        if(!b)return NULL;
        res+=(i+1);
        i=0;
    }
    
    while(res[i]!=c) {
        if(res[i]=='\0'){
            b=0;
            break;
        }
        i++;
    }
    res[i]='\0';
    return res;
}

古いスレッドには追加発言できません。