如何在C中创建令牌解析器?

如何在C中创建令牌解析器?,c,parsing,token,C,Parsing,Token,我看到了各种控制台应用程序的“配置”文件(是的,文本文件),如下所示 <token> <value> 啊,我忘了棘手的部分。我还必须能够解析一个令牌,它有多个值,或者用逗号分隔。使用,将输入流中的字符读入每行缓冲区。一旦点击令牌定界符,就可以将每行缓冲区插入令牌char*。如果需要,在令牌内定界符(如逗号)上再次解析令牌,每次捕获一个字符并将其存储在每个令牌缓冲区中,直到找到令牌内定界符为止。点击行分隔符后,将每行缓冲区复制到一个值char*。如果您知道该值是int、f

我看到了各种控制台应用程序的“配置”文件(是的,文本文件),如下所示

<token> <value>
啊,我忘了棘手的部分。我还必须能够解析一个令牌,它有多个值,或者用逗号分隔。

使用,将输入流中的字符读入每行缓冲区。一旦点击令牌定界符,就可以将每行缓冲区插入令牌
char*
。如果需要,在令牌内定界符(如逗号)上再次解析令牌,每次捕获一个字符并将其存储在每个令牌缓冲区中,直到找到令牌内定界符为止。点击行分隔符后,将每行缓冲区复制到一个值
char*
。如果您知道该值是
int
float
等,请使用C函数将
char*
转换为这些原语(例如,等)。如果您有多个令牌-值对,请保留一个或指向令牌和值
char*
变量的指针数组。重复直到EOF(文件结束)。

我认为
fgets()
sscanf()
是你的朋友:

int parseTokens(FILE *filePtr, char **tokens, char **values)
{
    int i = 0;

    char line[128];

    while (fgets(line, 127, filePtr)) {
        tokens[i] = malloc(64);
        values[i] = malloc(64);

        sscanf(line, "%s %s", tokens[i], values[i]);

        i++;
    }

    return i;
}

int main(void)
{
    char *tokens[20];
    char *values[20];

    FILE *filePtr = fopen("~/test.txt", "r");

    if (!filePtr)
    {
        fprintf(stderr, "Error opening file: %s", strerror(errno));
    }

    int count = parseTokens(filePtr, tokens, values);

    for (int i = 0; i < count; i++) {
        printf("%s %s\n", tokens[i], values[i]);

        free(tokens[i]);
        free(values[i]);
    }

    fclose(filePtr);
}
int解析令牌(文件*filePtr,字符**令牌,字符**值)
{
int i=0;
字符行[128];
而(fgets(第127行,文件管理器)){
令牌[i]=malloc(64);
值[i]=malloc(64);
sscanf(行,“%s%s”,标记[i],值[i]);
i++;
}
返回i;
}
内部主(空)
{
字符*代币[20];
字符*值[20];
FILE*filePtr=fopen(“~/test.txt”,“r”);
if(!filePtr)
{
fprintf(stderr,“打开文件时出错:%s”,strerror(errno));
}
int count=解析令牌(filePtr、令牌、值);
for(int i=0;i
试试这个:

    FILE* fp;
    fp = fopen("in.txt","r");

    if(fp == NULL)
    {
        printf("Can't open/read file.\n");
        exit(1);
    }

    char* buf = NULL;
    char* key = malloc(64);
    char* val = malloc(64);
    size_t read;
    size_t len = 0;

    if(key == NULL || val == NULL)
    {
        printf("malloc failed.\n");
        exit(1);
    }


    while((read = getline(&buf, &len, fp)) != -1)
    {
        sscanf(buf,"%s %s", key, val);
        printf("<%s> <%s>\n", key, val);
    }

    if(buf != NULL)
    {
      free(buf);
    }

    free(key);
    free(val);

    fclose(fp);
C应用程序输出:

<key> <value>
<key1> <value1>


我希望这对您有所帮助。

如何使用
regexp
?如果您使用的是linux,您可以使用它。而
manregexp.h
将了解如何使用它。按字符串存储它们。如果它们是数字,使用
sprintf
将它们转换为unmber

在你链接到的线程上有一条评论说“你可以使用strtok_r(),它是线程安全的。你可以在同一个手册页中看到它们。”定义什么是
,很容易提供具体的答案。@Arak我甚至提供了一个例子。[at]Vache,我一定错过了,我会看一看,同时我在等待更多的建议:)买龙书并找出:)可能会调查Lex和Yacc()我会建议
strtol
over
atoi
,因为你无法使用
atoi
判断它是否失败或数字是否为0。
key value
key1 value1
<key> <value>
<key1> <value1>