1

char 配列を CSV に分割する必要があります。実際には、次のstrtok()ように使用して逆を実行できます。

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

int main ()
{
 char str[] ="This,a,sample,string.";
 char * pch;
 printf ("Splitting string \"%s\" into tokens:\n",str);
 pch = strtok (str,",");
 while (pch != NULL)
 {
   printf ("%s\n",pch);
   pch = strtok (NULL, ",");
 }
 return 0;
}

しかし、私の場合、 char 配列の想定がありますchar bits[1024]="abcdefghijklmn"。出力を として取得する必要がありますa,b,c,d,e,f,g,h,i,j,k,m,n

これを行う関数またはライブラリはありますか。つまり、生の意味に関して、すべての文字にコンマを付ける必要があります。

4

4 に答える 4

1

古い基本からこの単純な関数を使用できます:

// ............................................................. string word at

char * word_at(char *tString, int upTo, char *dilim) {

     int wcount;
     char *rString, *temp;
    temp= (char *) malloc(sizeof(char) * (strlen(tString)+1));
    strcpy(temp, tString);

    rString= strtok(temp, dilim);
    wcount=1;

    while (rString != NULL){
        if (wcount==upTo) { 
     return rString;
        }
        rString= strtok(NULL, dilim);
        wcount++;
    }
   return tString ;
  }

パラメータ : 文字列、インデックス、区切り文字 戻り値 : 単語 : ( char *)

于 2013-07-02T11:01:12.357 に答える
1

これは、null で終了する文字列に対して機能します。ただし、最後にぶら下がっているコンマが残ります。

void tokenise(char *s, char *d)
{
 while(*d++ = *s++) *d++ = ',';
}

文字列の長さがすでにわかっている場合は、それを渡すことができます。これにより、ダングリングコンマが残りません。

void tokenise(char *s, char *d, int length)
{
    int i = 0;
    while((*d++ = *s++) && ((i++)<(length-1))) *d++ = ',';
}

どちらの例でsも、 はソース文字列へのポインターであり、dトークン化された出力文字列を指します。dバッファポイントが十分に大きいことを確認するのは、呼び出し元のコード次第です。

于 2013-07-02T11:56:10.657 に答える
0

簡単に実装できる場合は、これを開始するのに役立ちます

char* split_all( char arr[], char ch )
{
    char *new, *ptr;

    new = ptr = calloc( 1, 2*strlen( arr ) ); // FIXME : Error checks

    for( ; *(arr + 1) ; new++, arr++ )
    {
            *new = *arr;
            new++;
            *new = ch;
    }

    *new = *arr;
    return ptr;
}

これを再利用して、要件に合わせて最適化できます。その迅速で汚い解決策は、自由に修正してください..

于 2013-07-02T11:20:02.070 に答える