文字列を(たとえば)4文字ごとに分割する方法を知っている人はいますか?私のメッセージ (char バッファーに含まれる) は「Have a nice day」で、次のように表示されるように分割したいと考えています: "Have\0" "an\0" "ice \0" "day \ 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
AC 文字列は の NULL 終了配列ですchar
。ポインター演算と を組み合わせて使用できます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
関数で作業を分離する必要があり、sscanf は文字列を分割できます。コンパイル時の定数分割サイズの場合、次のように新しい N+1 char-size を介してポインターを反復処理できます。
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
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;
}
strndup のソース コードがない場合は、 http: //opensource.apple.com/source/gcc/gcc-5666.3/libiberty/strndup.c で入手できます。
于 2012-07-15T16:43:01.773 に答える