2017-01-05 1 views
1

У меня есть переменная, в которой я читал .txt-файл. Файл выглядит следующим образом:
Получить первый элемент первого элемента строки в C

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 
+3

Вы можете посмотреть 'strtok_r', который позволит вам иметь вложенные«strtok петли». – immibis

+2

'while (fgets (pluc, sizeof (pluc), plu)! = 0);' быстро достигнет EOF с этой точкой с запятой, не делая ничего. После его удаления, нужен ли следующий блок кода '{braces}' вокруг него? –

+0

Зачем использовать strtok - не будет strstr? – Hogan

ответ

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, "#"); 
    } 
+0

Wow thanks! Получил это. Это работает! : D – Fabian

Смежные вопросы