我有一个变量,我在其中读取了一个.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()时,您将因此告诉该函数放弃以前的标记化(使用#分隔符)以执行新的标记化。您可以考虑改用strtok_r(),这允许您一次维护多个标记的状态,但是由于您希望每一行上都有第一个标记,而且只需要第一个标记,所以我将考虑根本不在内部循环中使用strtok[_r]()
例如,这里有一个基于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, "#");
    }

关于c - 获取C中字符串的第一个元素的第一个元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41495291/

10-11 22:43
查看更多