使用子字符串检查字符串是否存在(使用链接列表)

时间:2018-02-28 02:14:41

标签: c string list substring strstr

我需要创建一个接收子字符串作为参数的函数,并检查链表中的任何字符串是否包含该子字符串。

该函数创建一个新的链表,其中包含所有包含给定子字符串的字符串。

该功能如下所示:

    lista *lista_pesquisa_substring(lista *lst, char *substring)
{
    l_elemento *aux, *curr;
    lista *lis2;
    int i = 0, tamanho;
    lis2 = lista_nova();
    if(lst == NULL || substring == NULL){
            return NULL;
    }
    for (aux = lst->inicio; aux != NULL; aux = aux->proximo)
            {
                curr = lista_elemento(lis2, i);
                if (strstr(*aux->str, substring) != NULL)
                {
                    lista_insere(lis2, aux->str, curr);
                    i++;
                }
            }
            tamanho = lista_tamanho(lis2);
            printf("Foram carregados %d jogos.\n", tamanho);
            for(i = 0; i < tamanho; i++)
            {
                curr = lista_elemento(lis2, i);
                printf("Pos %d -> %s\n", i, curr->str);
            }
            return lis2;
        }

if语句未按预期工作。它仅在给定的子字符串与链接列表中的字符串完全相同时才有效。

例如,如果链接列表中的字符串是“Hello there”,并且给定的子字符串是“Hello there”,那么if语句将起作用。 但是如果子串是“那里”,则if不起作用。

编辑: 我还应该提到用作参数的子字符串是由用户使用fgets函数写的。

我尝试使用预先存在的字符串来测试它并且它可以工作。所以我很困惑为什么它不适用于用户输入的字符串。

1 个答案:

答案 0 :(得分:0)

  

我还应该提到用作参数的子字符串是由用户使用fgets函数编写的。
  所以我很困惑为什么它不适用于用户输入的字符串。

当您使用fgets()函数从用户处获取输入时它不起作用的一个可能原因是,当用户提供输入并按ENTER键时,fgets()会将换行符视为一个有效的字符,并将其包含在用户给出的输入字符串中。因此,如果用户提供输入字符串"there"并按Enter键,fgets()将从输入流中读取字符并将其存储在缓冲区中,如下所示:

+---------------------------+
| t | h | e | r | e | \n| \0|
+---------------------------+
                      ^^

从输入缓冲区中删除尾随换行符,然后将其传递给查找链表中子串的函数:

inbuffer[strcspn(inbuffer, "\n")] = 0; //inbuffer is buffer which holds input string given by user