0

各トークン間にゼロ要素が存在する可能性があるコンマ区切りリストを解析する最も簡単な方法は何ですか? cstringは次のようになります

1, 3, 4, 5, 6, 7, 8, ....

しかし、次のようにも見える可能性があります

, , , , , , , , , ...

私は次のようなことを試しました:

char *original = "1, 3, 4, 5, 6, 7, 8, ...."
char *tok = strtok(original," ,")
while(tok!=NULL){
    while(*tok!='\0'){
      //dostuff
      tok++;
    }
tok=strtok(NULL," ,");
}

これは、コンマの間に要素がある場合にのみ機能するようです。たとえば、要素がない場合、最初の項目リストがスキップされることに気付きました。

strchr() などの他のソリューションを試しましたが、これは非常に見苦しく、もっと簡単な方法があると思います。

ありがとう

アップデート:

いくつかのテストの後、最初の項目が欠落している場合を除いて、すべてのケースで "," のトークン化が機能しているように見えることに気付きました。だから私はそれを特別なケースとして引き出しています。

char *original = "1, 3, 4, 5, 6, 7, 8, ...."
if(*original==',')
  //dostuff    
char *tok = strtok(original,",")
while(tok!=NULL){
    while(*tok!='\0'){
      //dostuff
      tok++;
    }
tok=strtok(NULL,",");
}

ご意見をお寄せいただきありがとうございます。(投稿する前にもっと慎重に考えるべきだったかもしれません。)

4

4 に答える 4

3

空のフィールドの解析を可能にするための代替となるように設計されている非標準 の を調べることをお勧めします。Finding Tokens in a Stringに関する glibc マニュアルの章も参照してください。多くのシステム (さまざまな BSD、Linux、Mac OS X) で利用できますが、標準化されていないため、Windows や Solaris には存在しない可能性があると思います。strsepstrtok

于 2009-12-30T04:28:18.257 に答える
2

空の「トークン」を無視するだけでよい場合は、strspn関数を使用して空白のみの文字列を検出できます。次に例を示します。

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


/* Is the given string whitespace only?
*/
int iswhitespace(char* s)
{
    return (strspn(s, " \t") == strlen(s));
}


int main()
{
    char line[] = "1, , 3, 4, 5, 6";
    char sep[] = ",";
    char* tok;

    tok = strtok(line, sep);

    while (tok)
    {
        if (iswhitespace(tok))
            printf("empty token\n");
        else
            printf("new token: %s\n", tok);

        tok = strtok(0, sep);
    }

    return 0;
}

ここでの重要なアイデアは、最初の要素をスキップする " ," ではなく、コンマのみでトークン化することです。空白は個別に処理できます。

もちろん、これstrtokは連続したカンマのスパンをスキップするという事実をまだ残しています。これが良くない場合は、使用できずstrtok、別のソリューションを採用する必要があります。

于 2009-12-30T04:38:07.460 に答える
0
strtok cannot cannot distinguish between `,` and `,,`.
于 2009-12-30T04:25:06.797 に答える
0

単純なforループはどうですか?

for (int begin = 0; original[begin]; ) {
  int end = begin;
  while (original[end] && original[end] != ',')
    ++end;

  // do something with original[begin] through original[end-1]

  begin = end;
}
于 2009-12-30T04:31:17.487 に答える