Функция поиска мотива выдает ошибку заглавными буквами - PullRequest
0 голосов
/ 12 марта 2019

Я реализовал эту функцию в C, чтобы найти мотив в данном файле. Таким образом, файл содержит сообщения, как показано ниже: Например, ISI, JE SERAI INGENIEURE и т. Д. Являются сообщениями.

19971230 20220512 JE SERAI INGENIEURE
19950511 20211230 ISI
19971230 20301123 INFORMATIQUE C'EST LA VIE
20020809 20081025 LANGAGE DE PROGRAMMATION
20070905 20201104 ECOLE INGENIEUR
19990102 20051025 ORDINATEUR
20081212 20200312 JE SUIS 

Каждая информация помещается в связанный список.

Это мой код:

void trouverMotif(message_t ** tete, char motif[])
{
    message_t *temp = *tete;
    char *ptr = motif;
    int i = 0, j = 0;

    while(temp != NULL)
    {
        printf("%s\n",temp->text);
        i = 0;
        j = 0;

        while(temp->text[i] != ptr[j] && temp->text[i] != '\0')
        {
            i++;
        }

        if(temp->text[i] == ptr[j])
        {
            while(temp->text[i] != '\0' && ptr[j] != '\0' && ptr[j] == temp->text[i])
            {
                j++;
                i++;
            }

            if(ptr[j] == '\0')
            {
                printf("%s", temp->text);
            }
        }
        temp = temp->suivant;
    }
}

Итак, результат, который я хочу получить, состоит в том, что, если я добавлю мотив = "INGE", результат выдаст мне сообщения, которые содержат "INGE", в моем случае; JE SERAI INGENIEURE и ECOLE INGENIEUR.

Проблема в том, что полученный мной результат - только ECOLE INGENIEUR, а не оба. Когда я изменяю сообщения на строчные буквы, это дает правильный результат (оба). Как это возможно?

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Код

   while(temp->text[i] != ptr[j] && temp->text[i] != '\0')
    {
        i++;
    }

    if(temp->text[i] == ptr[j])
    {
        while(temp->text[i] != '\0' && ptr[j] != '\0' && ptr[j] == temp->text[i])
        {
            j++;
            i++;
        }

        if(ptr[j] == '\0')
        {
            printf("%s", temp->text);
        }
    }

завершается ошибкой, если первый раз ptr присутствует в temp-> text , а не в последовательности, которую вы ищете

например, если ptr - это «AZE», а temp->text - «... A AZE», то вы первый раз установите i на 3 и после сравнения »AZE "и" A AZE "и не равны


Здесь предложение, код должен проверить, является ли мотив подстрокой текста каждого сообщения, поэтому более естественнымдолжен определить contient эквивалент strstr :

char * contient(const char * meule, const char * aiguille)
{
  /* strstr */
  while (*meule) {
    const char * p1 = meule;
    const char * p2 = aiguille;

    if (*p1 == *p2) {
      do {
        p1 += 1;
        p2 += 1;

        if (*p2 == 0)
          return (char *) meule;
      } while  (*p1 == *p2);
    }

    meule += 1;
  }

  return NULL;
}

void trouverMotif(message_t ** tete, char motif[])
{
  message_t *temp = *tete;

  while(temp != NULL)
  {
    /* printf("%s\n", p); */

    if (contient(temp->text, motif) != NULL)
      printf("'%s' found in '%s'\n", motif, temp->text);

    temp = temp->suivant;
  }
}

Например, если я добавлю:

typedef struct message_t {
  char * text;
  struct message_t * suivant;
}  message_t;

message_t * mk(char * t, message_t * n)
{
  message_t * r = malloc(sizeof(message_t));

  r->text = t;
  r->suivant = n;
  return r;
}

int main()
{
  message_t * tete = mk("19971230 20220512 JE SERAI INGENIEURE",
                        mk("19950511 20211230 ISI",
                           mk("19971230 20301123 INFORMATIQUE C'EST LA VIE",
                              mk("20020809 20081025 LANGAGE DE PROGRAMMATION",
                                 mk("20070905 20201104 ECOLE INGENIEUR",
                                    mk("19990102 20051025 ORDINATEUR",
                                       mk("20081212 20200312 JE SUIS ", NULL)))))));


  trouverMotif(&tete, "INGE");
}

Компиляция и выполнение:

pi@raspberrypi:/tmp $ ./a.out
'INGE' found in '19971230 20220512 JE SERAI INGENIEURE
'INGE' found in '20070905 20201104 ECOLE INGENIEUR

Примечание: вам не нужно trouverMotif(message_t ** tete, char motif[]), потому что вы не изменяете tete , поэтому trouverMotif(message_t * tete, char motif[]) достаточно

0 голосов
/ 12 марта 2019

При поиске INGE в JE SERAI INGENIEUR i в SERAI будет соответствовать I в INGE и переходить к N. When you reach INGENIEUR , you will no longer match the I`

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