我有这样一行文本:
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(®, "[0-9][+-]*", 0);
regmatch_t match = {0};
while (regexec(®, string+=match.rm_eo, 1, &match, 0) == 0)
printf("%.*sn", (int)(match.rm_eo-match.rm_so), string+match.rm_so);
}
有一个简单的方法来实现这一点,但在C
是有点复杂,因为我们没有vector
在C++
,但我可以建议一个纯粹的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;
}