有人知道如何每隔(例如)4个字符分割一个字符串吗?我的消息(包含在一个 char 缓冲区中)是“祝你有美好的一天”,我想将它拆分,使其以下列方式显示:“有\0”“an\0”“冰\0”“天\ 0”。每个拆分都包含在 char* temp[5] 中。函数“strtok”仅使用空格进行拆分,我需要每 4 个字节拆分一次消息的字符......我真的不知道该怎么做,有人能帮帮我吗?
问问题
6065 次
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 结尾的char
s 数组。您可以结合使用指针算术和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 回答