首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C中创建一个令牌解析器?

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

Stack Overflow用户
提问于 2012-03-29 07:25:03
回答 4查看 3.6K关注 0票数 2

我见过各种控制台应用程序的"config“文件(是的,文本文件),如下所示

代码语言:javascript
复制
<token> <value>

在C中,< value >可以是一个字符串,一个字母,甚至是一个整数/浮点/双精度,我该如何解析这样的东西呢?

我读到这个问题“How do I parse a token from a string in C?”,其中大多数人推荐使用strtok,但它也不是线程安全的,我计划生成多个线程(假设我能够完成我的应用程序)。

附注:这里是一个令牌和一个值的示例

代码语言:javascript
复制
user username123
pass 123456

啊,我忘了棘手的部分了。我还必须能够解析一个令牌,该令牌有多个用逗号分隔的值。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-29 08:04:45

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

代码语言:javascript
复制
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);
}
票数 3
EN

Stack Overflow用户

发布于 2012-03-29 07:34:17

使用getc()将字符从输入流读取到每行缓冲区中。一旦命中标记分隔符,就将每行缓冲区strncpy() or strdup()到标记char*中。如果需要,在令牌内分隔符(如逗号)上再次解析令牌,一次获取一个字符并将其存储在每个令牌缓冲区中,直到遇到令牌内分隔符。遇到行分隔符后,将每行缓冲区复制到值char*中。如果您知道值是intfloat等,请使用C函数将char*转换为这些原语(例如,strtol()等)。如果您有多个标记-值对,请保留一个标记和值char*变量的数组或指针。重复直到EOF (文件结束)为止。

票数 2
EN

Stack Overflow用户

发布于 2012-03-29 09:26:47

试试这个:

代码语言:javascript
复制
    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);

in.txt文件:

代码语言:javascript
复制
key value
key1 value1

C应用程序输出:

代码语言:javascript
复制
<key> <value>
<key1> <value1>

我希望这对你有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9917093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档