"this***is**my-beautiful--string"
字符串分割爲一個char [] [],我想這個分成
{"this", "***", "is", "**", "my", "-", "beautiful", "--", "string"}
有兩個分隔符"*-"
,所以我可以使用strtok()
來查找單詞
b我怎樣才能添加到數組中的delimeters?
"this***is**my-beautiful--string"
字符串分割爲一個char [] [],我想這個分成
{"this", "***", "is", "**", "my", "-", "beautiful", "--", "string"}
有兩個分隔符"*-"
,所以我可以使用strtok()
來查找單詞
b我怎樣才能添加到數組中的delimeters?
不能使用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
決定我們是否正在尋找一個分隔符或在之間的文本。基於此,我們必須查找包含字符(mode == 0
)或不包含(mode == 1
)在有效的delmiters字符串中的最長跨度。
此代碼可以在字符串文字上運行。它不會產生零終止的C字符串,但是,它們是常量字符串和字符串長度的組合。如果您需要將結果保存到數組中,我建議將它們保存爲指針加長度數據的結構。
通過分別將mode
初始化爲1或0,可以強制啓動具有(可能爲空)令牌或分隔符的令牌。
謝謝,這正是我需要的 – Dennis
可以使用的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);
}
這並不保存分隔符正是問題所在。 – nwellnhof
@nwellnhof哦,yah真的,我沒有得到這個觀點,我的錯誤和謝謝 –
這確實你說你想要的:
#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;
}
您也可以輕鬆瞭解使用此程序。
#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]);
}
如果'*'和'-'是分隔符,爲什麼它們是令牌的一部分?你真的想分割基於分隔符的字符串嗎? – HAL
問題是,當字符串之前有'*'時,我必須做一些不同於字符串之前有'-'的東西。 – Dennis
'strtok'會爲你的字符串寫一個空字符''\ 0'',所以你不能在這裏真正使用它 - 找到''this''後''分隔符'***''將被部分覆蓋。 (並且'strtok'不會在令牌化之後再次修補字符串。) –