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

3

只需遍历字符串,直到找到字符串结尾'\0'字符。或者使用数组中数据的长度(可能小于数组大小)并使用简单的for循环。

于 2013-07-02T10:48:57.690 回答
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 ;
  }

参数:字符串,索引和字符分隔符返回:单词:(字符*)

于 2013-07-02T11:01:12.357 回答
1

这适用于以空结尾的字符串。但它会在最后留下一个悬空的逗号。

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 回答