Как бы я использовал strtok, чтобы сравнить слово за словом - PullRequest
0 голосов
/ 01 июля 2011

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

Вот моя функция, которая выполняет это:

int wordcmp(FILE *fp1, FILE *fp2)
{
   char *s1;
   char *s2;
   char *tok;
   char *tok2;
   char line[BUFSIZE];
   char line2[BUFSIZE];
   char comp1[BUFSIZE];
   char comp2[BUFSIZE];
   char temp[BUFSIZE];
   int word = 1;
   size_t i = 0;

while((s1 = fgets(line,BUFSIZE, fp1)) && (s2 = fgets(line2,BUFSIZE, fp2)))
{
    ;
}

tok = strtok(line, " ");
tok2 = strtok(line, " ");

while(tok != NULL)
{
    tok = strtok (NULL, " ");

}


return 0;
}

Не обращайте внимания на неиспользуемые переменные, я занимался этим 3 часа и перепробовал все возможные способы сравнения значений первого и второго strtok. Также я хотел бы знать, как я проверю, какой файл первым достигнет EOF.

когда я пытался

  if(s1 == EOF && s2 != EOF)
  {
      return -1;
  }

Возвращает -1, даже если файлы одинаковые! Это потому, что для того, чтобы он достиг оператора if вне цикла, оба файла достигли EOF, что заставляет программу всегда переходить к этому оператору if?

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 01 июля 2011

Если вы хотите проверить, совпадают ли файлы, попробуйте сделать,

    do {
       s1 = fgetc(fp1);
       s2 = fgetc(fp2);

       if (s1 == s2) {
            if (s1 == EOF) {
                return 1; // RETURN TRUE
            }
            continue;
      }
      else {
        return -1;  // RETURN FALSE
      }

  } while (1);

Удачи:)

1 голос
/ 01 июля 2011

Когда вы используете strtok (), вы обычно используете код, подобный следующему:

tok = strtok(line, " ");
while (NULL != tok)
{
    tok = strtok(NULL, " ");
}

Значение NULL в вызове в цикле говорит strtok, что следует продолжить после ранее найденного токена, пока он не найдет нулевой завершающий символв значении, которое вы передали (строка) или до тех пор, пока не останется больше токенов.Текущий указатель сохраняется в библиотеке времени выполнения, и, как только strtok () возвращает NULL, чтобы указать, что больше нет токенов, больше вызовов strtok () с использованием NULL в качестве первого параметра (для продолжения) приведут к NULL.Вам нужно вызвать его с другим значением (например, другим вызовом strtok (line, "")), чтобы заставить его начать снова.

Что это означает, что вы можете использовать strtok для двух разных строк одновременновам нужно вручную обновлять позицию строки и передавать измененное значение при каждом вызове.

tok = strtok(line, " ");
tok2 = strtok(line2, " ");
while (NULL != tok && NULL != tok2)
{
    /* Do stuff with tok and tok2 here */
    if (strcmp(tok, tok2)... {}
    /* Update strtok pointers */
    tok += strlen(tok) + 1;
    tok2 += strlen(tok2) + 1;
    /* Get next token */
    tok = strtok(tok, " ");
    tok2 = strtok(tok2, " ");
}

Вам все равно нужно будет добавить логику для определения, отличаются ли строки - вы не сказали, являются ли файлыэквивалентны, если разрыв строки происходит в другой позиции, но слова, окружающие его, одинаковы.Я предполагаю, что это должно быть, учитывая ваше описание, но это делает логику более неловкой, поскольку вам нужно только выполнить начальные fgets () и strtok () для файла, если у вас еще нет токена.Вам также нужно посмотреть, как читаются файлы. В настоящее время ваш первый цикл while просто читает строки до конца файла без их обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...