gpt4 book ai didi

c - 根据初始格式解析字符串

转载 作者:太空宇宙 更新时间:2023-11-03 23:55:43 24 4
gpt4 key购买 nike

我正在尝试解析一组行并根据初始格式(读取配置文件)提取字符串的某些部分。

多一点解释:格式最多可以包含4 个要格式化的部分。这种情况下,%S 将跳过该部分,%a-%c 将提取该部分并将被视为字符串,%d作为整数。

我现在想做的是想出一些聪明的方法来解析它。到目前为止,我想出了以下原型(prototype)。但是,我的指针算法仍然需要一些工作来跳过/提取部分。

最终每个部分都将存储在一个结构数组中。

编辑:在这种情况下使用sscanf 可能不起作用,因为格式是在配置文件中指定的。此外,格式可能会缩放,字符串(和类型)可能会更改。

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

#define DIM(x) (sizeof(x)/sizeof(*(x)))

void process (const char *fmt, const char *line) {
char c;
const char *src = fmt;
while ((c = *src++) != '\0')
{
if (c == 'S'); // skip part
else if (c == 'a'); // extract %a
else if (c == 'b'); // extract %b
else if (c == 'c'); // extract %c
else if (c == 'd'); // extract %d (int)
else {
printf("Unknown format\n");
exit(1);
}
}
}

static const char *input[] = {
"bar 200.1 / / (zaz) - \"bon 10\"",
"foo 100.1 / / (baz) - \"apt 20\"",
};

int main (void) {
const char *fmt = "%S %a / / (%b) - \"%c %d\"";
size_t i;
for(i = 0; i < DIM (input); i++)
{
process (fmt, input[i]);
}
return (0);
}

最佳答案

scanf 表达式有时足以解析实际输入,并且可以在运行时或编译时构建它们。所以,在重新发明轮子之前,我会尝试遵循这条道路:

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

#define DIM(x) (sizeof(x)/sizeof(*(x)))

static const char *input[] = {
"bar 200.1 / / (zaz) - \"bon 10\"",
"foo 100.1 / / (baz) - \"apt 20\"",
};
const char *format = "%*[^ ] %[^ ] / / (%[^)]) - \" %[^ ] %d \"";

int main()
{
typedef char buffer[100];
buffer A,B,C;
int D, i, p;

for (i = 0; i < DIM(input); i++) {
if ((p = sscanf(input[i], format, A, B, C, &D)) == 4)
printf("%s %s %s %d\n", A, B, C, D);
else
printf("parsed only %d\n", p);
}
}

产生:

200.1 zaz bon 10
100.1 baz apt 20

关于c - 根据初始格式解析字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8198639/

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