64,642
社区成员
发帖
与我相关
我的任务
分享
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char **
strsplit(const char *str)
{
int size, count;
char **array;
char *item;
const char *head, *tail, *curr;
const char *ptr;
int len;
int quote, word;
size = 4;
array = (char **)malloc(sizeof(char *) * size);
count = 0;
word = 0;
quote = 0;
head = str;
tail = head + strlen(head) + 1;
for (curr = head; curr != tail; ++curr) {
if (word == 0) {
if (*curr == '\"') {
word = 1;
quote = 1;
ptr = curr + 1;
} else if (!isblank(*curr)) {
word = 1;
ptr = curr;
}
} else {
if (quote == 1) {
if (*curr == '\"') {
quote = 2;
}
} else if (quote == 0) {
if (isblank(*curr) || *curr == '\0') {
word = 0;
len = curr - ptr;
if (count + 1 >= size) {
size = size * 2;
array = (char **)realloc(array, sizeof(char *) * size);
}
item = malloc(len + 1);
memcpy(item, ptr, len);
item[len] = '\0';
array[count++] = item;
}
} else if (quote == 2) {
if (isblank(*curr) || *curr == '\0') {
quote = 0;
word = 0;
len = curr - 1 - ptr;
if (count + 1 >= size) {
size = size * 2;
array = (char **)realloc(array, sizeof(char *) * size);
}
item = malloc(len + 1);
memcpy(item, ptr, len);
item[len] = '\0';
array[count++] = item;
}
}
}
}
array[count] = NULL;
return array;
}
void
strfreev(char **array)
{
int i;
if (array) {
for (i = 0; array[i] != NULL; i++)
free(array[i]);
free(array);
}
}
int
main(int argc, char *argv[])
{
int i;
char **array;
array = strsplit("aaa bbb ccc");
for (i = 0; array[i] != NULL; i++)
printf("array[%d]='%s'\n", i, array[i]);
strfreev(array);
array = strsplit(" ddd \t eee \t fff ");
for (i = 0; array[i] != NULL; i++)
printf("array[%d]='%s'\n", i, array[i]);
strfreev(array);
array = strsplit("xxx \"yyy yyy\" zzz");
for (i = 0; array[i] != NULL; i++)
printf("array[%d]='%s'\n", i, array[i]);
strfreev(array);
array = strsplit("abcd efg \"hijk lmn\" opq rst \"uvw xyz\"");
for (i = 0; array[i] != NULL; i++)
printf("array[%d]='%s'\n", i, array[i]);
strfreev(array);
return 0;
}
/* output
array[0]='aaa'
array[1]='bbb'
array[2]='ccc'
array[0]='ddd'
array[1]='eee'
array[2]='fff'
array[0]='xxx'
array[1]='yyy yyy'
array[2]='zzz'
array[0]='abcd'
array[1]='efg'
array[2]='hijk lmn'
array[3]='opq'
array[4]='rst'
array[5]='uvw xyz'
*/
#include <stdio.h>
/*
aaa "bbb ccc" ddd
*/
int main()
{
int flage=0 ;
char ch;
for(;;)
{
ch=getchar();
if(ch=='\n')break ;
switch(ch)
{
case '\"' :
flage=!flage ;
break ;
case ' ' :
if(!flage)printf("\n");
else printf(" ");
break ;
default :
printf("%c",ch);
break ;
}
}
return 0 ;
}
只是输出而已//aaa "bbb ccc" ddd
//则分割后需要三个部分:
//aaa
//bbb ccc
//ddd
#include <stdio.h>
int par(char **s,int *L) {
int st;
char *p=*s;
st=0;
while (1) {
switch (st) {
case 0:
if (*p==0 ) return 0;
else if (*p==' ' );
else if (*p=='\"') {*s=p+1;*L=0;st=2;}
else {*s=p;*L=1;st=1;}
break;
case 1:
if (*p==0 ) return 1;
else if (*p==' ' ) return 1;
else if (*p=='\"') {printf("error");return 0;}
else (*L)++;
break;
case 2:
if (*p==0 ) {printf("error");return 0;}
else if (*p=='\"') {st=0;return 1;}
else (*L)++;
break;
}
p++;
}
}
int main() {
char *str="aaa \"bbb ccc\" ddd";
char *p;
int r,n;
p=str;
while (1) {
r=par(&p,&n);
if (r==0) break;
printf("[%.*s]\n",n,p);
p+=n;
if (p[0]=='\"') p++;
}
return 0;
}
//[aaa]
//[bbb ccc]
//[ddd]
//