首页 > 解决方案 > 动机的功能搜索给出了大写字母的错误

问题描述

我已经在 C 中实现了这个函数来在给定的文件中找到一个动机。因此该文件包含以下消息: 例如ISIJE 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 而不是两者。当我将消息更改为小写字母时,它会给出正确的结果(两者)。这怎么可能?

标签: c

解决方案


编码

   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”并且不等于


这里有一个建议,代码必须检查主题是否是每个消息文本的子字符串,所以更自然的是定义strstr的contient等价物:

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[])就足够了


推荐阅读