文字列のSPLITで区切り文字が連続するとき・・・ – プログラミング – Home

文字列のSPLITで区切り文字が連続す...
 
通知
すべてクリア

[解決済] 文字列のSPLITで区切り文字が連続するとき・・・


レン
 レン
(@レン)
ゲスト
結合: 20年前
投稿: 7
Topic starter  

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


引用未解決
トピックタグ
REE
 REE
(@REE)
ゲスト
結合: 23年前
投稿: 240
 

>仕方ないので元文字列を読み、\t\tと2回続けている時はその間にスペースを入れると
いう新
>しい文字列を作成することで読んでいます。

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


返信引用
AC
 AC
(@AC)
ゲスト
結合: 20年前
投稿: 6
 

>文字列を特定の文字で分割する場合、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
 AC
(@AC)
ゲスト
結合: 20年前
投稿: 6
 

すみません。リロードしていませんでした。


返信引用
まきじ
 まきじ
(@まきじ)
ゲスト
結合: 20年前
投稿: 35
 

\t の数が固定でしたら、sscanf でいいと思います。


返信引用
レン
 レン
(@レン)
ゲスト
結合: 20年前
投稿: 7
Topic starter  

お返事ありがとうございます。

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

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


返信引用
レン
 レン
(@レン)
ゲスト
結合: 20年前
投稿: 7
Topic starter  

自分で作り直した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;
}


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました