gpt4 book ai didi

c - 提取c中分隔符之间的文本

转载 作者:行者123 更新时间:2023-11-30 17:44:28 24 4
gpt4 key购买 nike

我正在寻找的基本上相当于提取括号之间的文本,这就是我将使用的示例。如果我的输入类似于 (test 1 2)(test 3 4)test foo bar(test Again) 下面的代码将返回我想要的内容:

token: test 1 2
token: test 3 4
token: test again

但是如果我的输入是(test 1 (test 2 3)foo(bar test) Again)我得到

token: test 1 
token: test 2 3
token: bar test

我不想看到测试 1。是的,它位于左括号和右括号之间,但这意味着该数据的上游出现了问题。

void print_tokens(char *s) {
printf("input: %s\n",s);
char *output;
const char *valid = "abcdefghijklmnopqrstuvwxyz0123456789 ";
unsigned int length;
s=strchr(s,'(')+1;
length=strspn(s,valid);
while(s!=NULL && length>0) {
output=malloc(length+1);
strncpy(output,s,length);
output[length]='\0';
printf("token: %s\n",output);
free(output);
if(strchr(s,'(')!=NULL) {
s=strchr(s,'(')+1;
length=strspn(s,valid);
} else {
s=NULL;
}
}
}

除了内存管理相当宽松之外,这种简单的方法可能“足够接近”,因为我有另一个函数(输出实际上会传递到该函数,对它自己的输入进行一些检查,但这可能会仍然让一些格式错误的表达式通过,如果可能的话,我想避免这种情况。尽管我正在寻找的内容可以很容易地用正则表达式来概括 (/.*\(([a-z0-9 ] *?)\)/ 我相信),它必须或多或少是标准 C 语言。GNU C、Boost 和我见过的大多数其他有助于字符串解析或正则表达式的库都不是我无法使用。

是否有更好的方法来提取此文本以消除无关的标记?并且使用有效的字符集更加灵活(例如,除了左右括号之外的所有内容)?

最佳答案

这应该就可以做到:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

void print_tokens(char *s)
{
printf("input: %s\n", s);
char *start = s;
char *end = s;
while(*s) {
if(*s == '(') start = s;
else if(*s == ')') end = s;
if(start < end && *start) {
*end = 0;
printf("token: %s\n", start+1);
start = s = end;
}
s++;
}
}

int main()
{
char str[] = "(test 1 (test 2 3)foo(bar test) again)";
char str2[] = "(test 1 2)(test 3 4)test foo bar(test again)";
print_tokens(str);
print_tokens(str2);
return 0;
}

它适用于您给我的两个测试用例。请注意,它会破坏原始字符串,因此如果您不希望它这样做,则应该添加一些代码来复制该字符串。

关于c - 提取c中分隔符之间的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19986599/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com