вопрос strtok, он не работает, как ожидалось - PullRequest
0 голосов
/ 28 декабря 2011

У меня есть функция, которая читает отформатированный файл.Это выглядит так:

1;Name_of_the_author;The date when the quote was published;The author of the quote;The quote
2;Name_of_the_author_2;The date when the second quote was published;The author of the second quote;The second quote

Итак, разделитель есть;,Что мне нужно сделать, так это проверить каждую последовательность / токен и проверить, верна ли она.Проблема, однако, в том, что он не получает все токены, только первые три, после даты, когда он просто ломается, он не перемещается ... вот прикрепленная функция кода.Не обращайте внимания на комментарии, это для школьного проекта, и комментарии на румынском.Нет цитаты и нет автора.Поэтому я не могу их проверить и проверить, правда ли это

Ответы [ 3 ]

3 голосов
/ 28 декабря 2011

Здесь:

string = var;
var2 = strtok(string, " ");

У тебя проблемы. strtok забывает, что когда-то он имел более длинную строку для токенизации, теперь все, что он помнит, это часть, которую он ранее возвратил. Вы можете токенизировать разные строки одновременно с strtok_r. Прочитайте справочную страницу для более подробной информации.

Если strtok_r недоступно, в вашей ситуации это будет самый простой способ выполнить анализ во внутреннем цикле в case 3 без использования strtok. Поскольку ожидаемый формат является жестким, проверить все три поля по порядку несложно. Вы можете, если решитесь, также сохранить расположение байтов '\ 0', которые strtok вставлены в буфер, и после внутреннего цикла заменить их на '' или ';', в зависимости от ситуации, и передать Модифицированный буфер снова strtok. Но это очень подвержено ошибкам, я настоятельно рекомендую не пытаться это делать.

1 голос
/ 28 декабря 2011

Вы можете начать с удаления первого цикла и других переменных.Первый strtok должен находиться вне цикла, который поможет вам разделить каждый токен, это нужно сделать для того, чтобы сохранить буфер, который вы хотите обработать, в функции strtok.Вы не можете повторно использовать функцию strtok, пока не будете уверены, что больше не хотите делить свои основные данные, потому что, если вы повторно используете strtok до окончания основной обработки, вы сбрасываете данные, используемые функцией strtok.пример:

char str[] = "hello world how are you?\n";
char *res;
// here i tell strtok the string str is the one i want to separate
res = strtok(str, " \n");
int i = 0;
// here i separate str, using the caracters space and endline as separators
while (res != null)
{
 res = strtok(NULL, " \n"); // each time i pass in this part of the loop i get my new     word in res
 ++i; // here the variable i represents the number of times i enter the loop
}

// here i can use again strtok with another string

Если функция sscanf разрешена в вашем назначении, и, поскольку вы, кажется, знаете точный формат вашего файла, вы можете использовать его.Также функция getline позволяет вам извлекать строку за строкой вашего файла, и вы можете обрабатывать каждое предложение за раз.

0 голосов
/ 28 декабря 2011

образец кода strtok, создает массив указателей на каждый элемент, который strtok удаляет из большой строки.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX_SPLIT 10

void split(char **result, char *working, const char *delim)
{
          int i;
          char *p=strtok(working, delim);
          for(i=0; p!=NULL && i<MAX_SPLIT; p=strtok(NULL, delim), i++ )
          {
              result[i]=p;
              result[i+1]=NULL;
          }
}

int foo(const char *splitme, const char *delim)
{
    int retval=0;
    char *result[MAX_SPLIT]={NULL};
    char *working=strdup(splitme);
    int i=0;
    if(working!=NULL)
    {
          split(result, working, delim);
        retval=1;
        while(result[i]!=NULL)        
              printf("%s\n", result[i++]);                     
        free(working);      
    }
    return retval;
}
...