2

有人知道如何每隔(例如)4个字符分割一个字符串吗?我的消息(包含在一个 char 缓冲区中)是“祝你有美好的一天”,我想将它拆分,使其以下列方式显示:“有\0”“an\0”“冰\0”“天\ 0”。每个拆分都包含在 char* temp[5] 中。函数“strtok”仅使用空格进行拆分,我需要每 4 个字节拆分一次消息的字符......我真的不知道该怎么做,有人能帮帮我吗?

4

5 回答 5

3
const char *str = "have a nice day "; // 16 chars to be divisible by 4, else the last strndup won't work properly...
size_t len = strlen(str);

const char **fragments;
fragments = malloc(sizeof(*fragments) * len / 4);
int i;

for (i = 0; i < (len / 4); i++)
{
    fragments[i] = strndup(str + 4 * i, 4);
}

现在片段应该包含,嗯,片段......

于 2012-07-15T16:33:38.570 回答
1
#include <stdio.h>
#include <stdlib.h>

char *split(const char *str, size_t size){
    static const char *p=NULL;
    char *temp;
    int i;
    if(str != NULL) p=str;
    if(p==NULL || *p=='\0') return NULL;
    temp=(char*)malloc((size+1)*sizeof(char));
    for(i=0;*p && i<size;++i){
        temp[i]=*p++;
    }
    temp[i]='\0';
    return temp;
}

int main(){
    char *p = "Have a nice day";
    char *temp[5];
    int i,j;

    for(i=0;NULL!=(p=split(p, 4));p=NULL)
        temp[i++]=p;

    for(j=0;j<i;++j){
        printf("\"%s\"\n", temp[j]);
        free(temp[j]);
    }
    return 0;
}
于 2012-07-15T22:32:18.587 回答
0

您应该将您的工作分开在一个函数中,并且 sscanf 可以拆分字符串。对于编译时的恒定拆分大小,您可以使用指针在新的 N+1 字符大小上进行迭代,例如:

char (*split4chars(char *s,char (*b)[5]))[5]
{ /* returns a pointer to char[5] elements */
  int n;
  while( 1==sscanf(s,"%4[^\n]%n",*b++,&n) ) s+=n;
  return --b;
}

int main()
{
  char *s = "Have a nice day";
  char (*b)[5] = malloc(ceil(strlen(s)/4)*5), /* enough memory for destination */
       (*e)[5] = split4chars(s,b);

  while( e!=b ) /* iterate from begin to end here */
    puts(*b++);

  return 0;
}
于 2012-07-15T20:59:24.897 回答
0

AC 字符串是以 NULL 结尾的chars 数组。您可以结合使用指针算术和memcpy

const char* originalString = "Have a nice day";

char str1[5];
char str2[5];
memcpy(str1, originalString, 4);
str1[4] = 0;
memcpy(str2, originalString + 4, 4);
str2[4] = 0;
于 2012-07-15T16:32:33.580 回答
0
char** split(char* input)
{
    int count = (strlen(input) + 3) / 4;
    char** splitted = (char**)malloc(count * sizeof(char*));
    char** currentSplitted = splitted;
    while (*input != 0)
    {
        *currentSplitted = strndup(input, 4);
        input += strlen(*currentSplitted++);
    }

    return splitted;
}

int main()
{
    char* input = "Have a nice day";
    char** splitted = split(input);
    return 0;
}

如果没有,可以在http://opensource.apple.com/source/gcc/gcc-5666.3/libiberty/strndup.c获取 strndup 的源代码。

于 2012-07-15T16:43:01.773 回答