在C中获取字符串的第一个元素的第一个元素

时间:2017-01-05 21:47:03

标签: c arrays file token strtok

我有一个变量,我在其中读取.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

1 个答案:

答案 0 :(得分:1)

你的主要问题是,当你在循环内部用非空的第一个参数调用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, "#");
    }