我有字符串
"this***is**my-beautiful--string"
我想把它分成
{"this", "***", "is", "**", "my", "-", "beautiful", "--", "string"}
有两个分隔符"*-"
,因此我可以使用strtok()
来查找单词
但是如何将分隔符添加到数组中呢?
答案 0 :(得分:2)
你不能在这里使用strtok
,因为它通过用空字符覆盖它们来“破坏”输入字符串中的delmiters。您可以使用strspn
和strcspn
这样的功能:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int xmain() {
const char *str = "this***is**my-beautiful--string";
const char *delim = "*-";
const char *p = str;
int mode = strchr(delim, *str) == 0;
while (*p) {
int n;
if (mode) {
n = strcspn(p, delim);
} else {
n = strspn(p, delim);
}
printf("'%.*s'\n", n, p);
mode = !mode;
p += n;
}
return 0;
}
mode
确定我们是在寻找分隔符还是两者之间的文本。基于此,我们必须在有效的delmiters字符串中查找包含的最长字符(mode == 0
)或不包括(mode == 1
)。
此代码可以在字符串文字上运行。但是,它不会产生零终止的C字符串,而是常量字符串和字符串长度的组合。如果需要将结果保存在数组中,我建议将它们保存为指针加长度数据的结构。
您可以通过将mode
分别初始化为1或0来强制使用(可能为空)令牌或分隔符启动令牌。
答案 1 :(得分:0)
这就是你想要的:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define PARSED_CHUNKS 4
struct parsed {
char **data;
size_t count;
size_t alloc;
};
void allocate(struct parsed *p)
{
if (p->count == p->alloc)
{
p->alloc += PARSED_CHUNKS;
p->data = realloc(p->data, p->alloc * sizeof(char *));
if (p->data == 0)
{
fprintf(stderr, "no memory\n");
exit(1);
}
}
}
int main()
{
const char *str = "this***is**my-beautiful--string";
const char *start;
unsigned int i;
struct parsed p;
memset(&p, 0, sizeof(p));
for(;;)
{
allocate(&p);
start = str;
while(*str != '*' && *str != '-' && *str != '\0')
str ++;
if (str-start > 0)
p.data[p.count++] = strndup(start, str-start);
if (*str == '\0')
break;
allocate(&p);
start = str;
while(*str == '*' || *str == '-' && *str != '\0')
str ++;
p.data[p.count++] = strndup(start, str-start);
if (*str == '\0')
break;
};
for (i = 0; i < p.count; i++)
{
printf("%d: %s\n", i, p.data[i]);
}
return 0;
}
答案 2 :(得分:0)
您也可以使用此程序轻松理解。
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
main()
{
int i = 0 ,j = 0 ,k = 0,l=0;
char string[]="this***is**my-beautiful--string";
char *string1[9],tem[20];
for ( i = 0 ; string[i] != '\0' ; i++ )
{
if ( isalpha(string[i] ) )
{
if(l != 0)
{
tem[l] = '\0';
string1[k]=(char *)malloc(strlen(tem)+1);
strcpy(string1[k],tem);
k++;
l=0;
}
tem[j++]=string[i];
}
else
{
if(j != 0)
{
tem[j] = '\0';
string1[k]=(char *)malloc(strlen(tem)+1);
strcpy(string1[k],tem);
k++;
j=0;
}
tem[l++]=string[i];
}
}
for ( i = 0 ; i < k ; i++ )
printf("split string is :%s\n",string1[i]);
}
答案 3 :(得分:-1)
你可以像这样使用strtok()
char line[] = "this***is**my-beautiful--string";
char *token;
char *deli;
deli="*-";
token = strtok(line, deli);
while(token!=NULL){
printf("%s",token);
token = strtok(NULL,deli);
}