如何在c中使用多个分隔符进行分割



我有这样一行文本:

32+-#3#2-#3#3

我需要将数字彼此分开。所以基本上结果是这样的:

3
2+-
3
2-
3
3

这是我的代码,但它不能正常工作,因为我有两个数字:

#include <stdio.h>
#include <string.h>
int main(void) {
char string[50] = "32-#3#2-#3#3";
// Extract the first token
char *token = strtok(string, "#");
// loop through the string to extract all other tokens
while (token != NULL) {
printf(" %sn", token); //printing each token
token = strtok(NULL, "#");
}
return 0;
}

不能单独使用strtok,因为要分割的数字之间没有分隔符。没有strtok更容易,只需打印您想要打印的内容并添加分隔符,除非后面有属于令牌的字符:

#include <stdio.h>
int main()
{
char string[] = "32+-#3#2-#3#3";
for (char *token = string; *token; ++token)
if ('0'<=*token && *token<='9' || *token=='+' || *token=='-')
{
putchar(*token);
if (token[1]!='+' && token[1]!='-') putchar('n');
}
}

如果您认为这太简单了,您可以使用正则表达式来匹配标记:

#include <stdio.h>
#include <regex.h>
int main()
{
char *string = "32+-#3#2-#3#3";
regex_t reg;
regcomp(&reg, "[0-9][+-]*", 0);
regmatch_t match = {0};
while (regexec(&reg, string+=match.rm_eo, 1, &match, 0) == 0)
printf("%.*sn", (int)(match.rm_eo-match.rm_so), string+match.rm_so);
}

有一个简单的方法来实现这一点,但在C是有点复杂,因为我们没有vectorC++,但我可以建议一个纯粹的C的实现,可以改进:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void split_ss(const char* src,const char* pattern, char** outvec, size_t* outsize)
{
const size_t  pat_len = strlen(pattern);
char* begin = (char*) src;
const char* next = begin;
if ((begin = strstr((const char*)begin, pattern)) != 0x00) {
unsigned int size = begin - next;
*outvec = malloc(sizeof(char) * size);
memcpy(*outvec , next, size);
outvec++;
(*outsize)+=1;
split_ss(begin+pat_len, pattern, outvec, outsize);
} else {
unsigned int size = &src[strlen(src)-1] - next + 1;
*outvec = malloc(sizeof(char) * size);
memcpy(*outvec, next, size);
(*outsize) += 1;
}
}

int main()
{
char* outdata[64] = {0};
size_t size, i=0;
split_ss("32+-#3#2-#3#3", "#", outdata, &size);
for(i=0; i < size; i++) {
printf("[%s]rn", outdata[i]);
}
// make sure to free it
return 0;
}

strstr用于按字符串而不是按字符进行分割。此外,输出是一个可怜的2D数组,迭代它的大小,不要忘记释放它。

strtok()不是适合您的工具…事实上,strtok()由于其复杂的语义和副作用,很少是用于任何目的的正确工具。

一个简单的循环可以:

#include <stdio.h>
int main(void) {
char string[50] = "32+-#3#2-#3#3";
for (char *p = string; *p; p++) {
if (*p == '#')
continue;
putchar(*p);
while (p[1] == '+' || p[1] == '-')
putchar(*++p);
putchar('n');
}
return 0;
}