2017-02-18 8 views
0

文字列をトークンに分割するstrtok()関数を使用しています。行内に2つの区切り文字がある場合は問題です。行内に2つの区切り文字がある場合、文字列をCのトークンに分割する

/* strtok example */ 
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char str[] ="Test= 0.28,0.0,1,,1.9,2.2,1.0,,8,4,,,42,,"; 
    char * pch; 
    printf ("Splitting string \"%s\" into tokens:\n",str); 
    pch = strtok (str,", "); 
    while (pch != NULL) 
    { 
    printf ("Token = %s\n",pch); 
    pch = strtok (NULL, ", "); 
    } 
    return 0; 
} 

そして出力:

Splitting string "Test= 0.28,0.0,1,,1.9,2.2,1.0,,8,4,,,42,," into tokens: 
Token = Test= 
Token = 0.28 
Token = 0.0 
Token = 1 
Token = 1.9 
Token = 2.2 
Token = 1.0 
Token = 8 
Token = 4 
Token = 42 

あり、すべてのトークンを取得するための、いくつかの簡単な方法;私は区切り文字の内側に何か原因XXX、そこに私が手倍だ,,かありますかどうかを知る必要があり、

ありがとうございました。

+1

['strsep'](http://man7.org/linux/man-pages/man3/strsep.3.html)を持っているシステムでは、代わりに使うことができます。 –

+0

[strtok()とstrtok_single()]が混在している必要があります(http://stackoverflow.com/questions/30294129/i-need-a-mix-of-strtok-and- strtok-single)も考えています。そこからも多くの質問がリンクされています。このような問題に遭遇したのは初めてのことではありません。 –

答えて

0

strtok()あなたが望むものとは明確に反対です。オンラインマニュアルで発見

が解析 ストリング内の2つの以上の連続する区切りバイトのシーケンスは、単一の区切り文字であると考えられます。 の文字列の区切り文字は無視されます。言い換えると、strtok()によって返されたトークン は、常に空ではない文字列です。

strtok(3) - Linux man page

私はstrtoke()を実装 - 同様の振る舞いが、あなたは何をしたいんstrtok()の変種:

/* strtoke example */ 
#include <stdio.h> 
#include <string.h> 

/* behaves like strtok() except that it returns empty tokens also 
*/ 
char* strtoke(char *str, const char *delim) 
{ 
    static char *start = NULL; /* stores string str for consecutive calls */ 
    char *token = NULL; /* found token */ 
    /* assign new start in case */ 
    if (str) start = str; 
    /* check whether text to parse left */ 
    if (!start) return NULL; 
    /* remember current start as found token */ 
    token = start; 
    /* find next occurrence of delim */ 
    start = strpbrk(start, delim); 
    /* replace delim with terminator and move start to follower */ 
    if (start) *start++ = '\0'; 
    /* done */ 
    return token; 
} 

int main() 
{ 
    char str[] ="Test= 0.28,0.0,1,,1.9,2.2,1.0,,8,4,,,42,,"; 
    char * pch; 
    printf ("Splitting string \"%s\" into tokens:\n",str); 
    pch = strtoke(str,", "); 
    while (pch != NULL) 
    { 
    printf ("Token = %s\n",pch); 
    pch = strtoke(NULL, ", "); 
    } 
    return 0; 
} 

はcygwinの上でgccでコンパイルおよびテスト:

$ gcc -o test-strtok test-strtok.c 

$ ./test-strtok.exe 
Splitting string "Test= 0.28,0.0,1,,1.9,2.2,1.0,,8,4,,,42,," into tokens: 
Token = Test= 
Token = 0.28 
Token = 0.0 
Token = 1 
Token = 
Token = 1.9 
Token = 2.2 
Token = 1.0 
Token = 
Token = 8 
Token = 4 
Token = 
Token = 
Token = 42 
Token = 
Token = 

を上記リンクからの別の引用:

これらの機能を使用する場合は注意してください。これらを使用する場合は、次の点に注意してください。

  • これらの関数は、最初の引数を変更します。
  • これらの関数は定数文字列では使用できません。
  • 区切りバイトのIDは失われます。
  • strtok()関数は解析中に静的バッファを使用するため、スレッドセーフではありません。これが問題になる場合は、strtok_r()を使用してください。

これらの問題は私のstrtoke()にも当てはまります。

関連する問題