【问题标题】:Get the first element of the first element of an string in C获取C中字符串的第一个元素的第一个元素
【发布时间】:2017-01-05 21:47:02
【问题描述】:

我有一个变量,我在其中读取了一个 .txt 文件。该文件如下所示:

Element1|Element2|Element3|...|ElementLast#Element1|Element2|Element3|...|ElementLast#Element1|Element2|Element3|...|ElementLast#Element1|Element2|Element3|...|ElementLast


现在我想做的是,获取每个 'Element1' 并检查它是否等于特定字符串。
我阅读了很多关于函数 strtok() 的内容并尝试使用它。
这是我的函数:(id是这个特殊的字符串,我在函数中转换它。)

int PLUexists(int id) {

    char idc[3];
    sprintf(idc, "%d", id);
    printf("%s", idc);

    /* My Main String */
    FILE *plu = fopen("kassa_plu.txt", "r");
    char pluc[2000];
    while( fgets(pluc, sizeof(pluc), plu) !=0 );

    /* My Token */
    char *token;

    /* get first line */
    token = strtok(pluc, "#");

    while( token != NULL ) {
        printf(" %s \n", token);

        // Without that block, I get all lines seperated...
        char t[255];
        strcpy(t, token);

        if ( strcmp(strtok(t, "|"), idc) == 0) {
            printf("Jep");
            return 1;
        }
        // End 'block'

        token = strtok(NULL, "#");
    }
    return 0;
}

现在,如果我只是打印出第一个标记(并重复它),我的所有行都会分开(见下文),但是当我还解析 printf(" %s \n", token);token = strtok(NULL, "#"); 之间的代码时,它将不起作用.

无块:

Element1|Element2|Element3|...|ElementLast
Element1|Element2|Element3|...|ElementLast
Element1|Element2|Element3|...|ElementLast
Element1|Element2|Element3|...|ElementLast

有了它:

Element1|Element2|Element3|...|ElementLast
Element2|Element3|...|ElementLast
Element3|...|ElementLast
...|ElementLast
ElementLast

【问题讨论】:

  • 您可以查找strtok_r,这将允许您嵌套“strtok 循环”。
  • while( fgets(pluc, sizeof(pluc), plu) !=0 ); 将快速到达 EOF,那里的分号不做任何事情。去掉之后,下面的代码块是不是需要{ braces }围起来?
  • 为什么要使用 strtok -- strstr 不是很好吗?
  • 你是对的循环,@WeatherVane,但也许 OP 想要 只处理他文件的最后一行。如果是这样,并且如果可以依赖文件不完全为空,那么这是一个不错的方法。

标签: c arrays file token strtok


【解决方案1】:

您的主要问题是,当您在循环内调用strtok() 时使用非空的第一个参数,从而告诉该函数放弃它正在执行的先前标记化(通过# 定界符)新的标记化。您可以考虑使用 strtok_r() 代替,它允许您一次维护多个标记化的状态,但由于您希望 first 标记在每一行并且只有第一行,我会考虑不使用 @ 987654324@ 完全在内循环中。

例如,这里有一个基于strchr()的类似方法:

    while( token != NULL ) {
        printf(" %s \n", token);

        char *delim = strchr(token, '|');
        if (delim) *delim = '\0';

        if (strcmp(token, idc) == 0) {
            printf("Jep");
            return 1;
        }

        token = strtok(NULL, "#");
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 2013-06-12
    • 2013-06-21
    • 2021-04-07
    • 2019-03-26
    • 1970-01-01
    • 2021-10-27
    相关资源
    最近更新 更多