Нахождение подстроки, используя указатели - PullRequest
0 голосов
/ 11 декабря 2018

Как упомянуто в заголовке, я хочу проверить, найдена ли подстрока в другой строке.

#include <stdio.h>
#include <stdlib.h>

int isIncluded(char *text, char* pattern);

int main()
{

    char text[30];
    char pattern[30]; int result;

    printf(" Please introduce your text \n");
    scanf("%s", &text);

    printf(" Please introduce the pattern you are looking for \n");
    scanf("%s", &pattern);



    result = isIncluded( &text, &pattern);

    if ( result == 1)
    {

        printf(" Your pattern has been found in your text \n " ) ;
    }
    if ( result == 0)
    {

        printf(" no substring found \n " ) ;
    }

}


int isIncluded(char *text, char* pattern)
{

    int ct = 0;
    int numberofcharacters = 0;

    while ( *pattern != '\0')
    {
        pattern++;
        numberofcharacters++;

    }

    while ( *text != '\0' && pattern != '\0')
    {
        if ( *pattern == *text)
        {
            pattern++;
            ct++;
            text++;

        }
        else
        {
           text++;
        }

    }

    if ( ct == numberofcharacters ) 
    {
        return(1);
    }
    else
    {
            return(0);
    }


}

Идея состоит в том, чтобы сравнить первый символ текстовой переменной с переменной шаблона,Возьмем пример:

Предположим, у нас есть «TEXT» в текстовой переменной и «EX» в шаблоне:

Я начинаю сравнивать T с E, в этом случае, нет совпадения.

Я указываю на E и снова сравниваю, есть совпадение.

Из-за совпадения я указываю на X в шаблоне и делаю то же самое в тексте, и я делаю еще один тест.

2-е совпадение, поэтому количество символов в переменной pattern будет таким же, как и в переменной ct, которая учитывается только при совпадении.

Следовательно, возвращаемое значение должно быть равно 1.

Код всегда возвращает ноль.Я не понимаю, почему?

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018
    #include <stdio.h>
#include <stdlib.h>

int isIncluded(char *text, char* pattern);

int main()
{

char text[30];
char pattern[30]; int result;

printf(" Please introduce your text \n");
scanf("%s", text);

printf(" Please introduce the pattern you are looking for \n");
scanf("%s", pattern);



result = isIncluded( text, pattern);
if ( result == 1)
{

printf(" Your pattern has been found in your text \n " ) ;
}
if ( result == 0)
{

printf(" no substring found \n " ) ;
}



}


int isIncluded(char *text, char* pattern)
{

char *tempPattern = pattern;
int ct = 0;
int numberofcharacters = 0;

    while (  *tempPattern != '\0')
{
        tempPattern++;

      numberofcharacters++;

}

    while ( *text != '\0' && pattern != '\0')
    {
            if ( *pattern == *text)
        {
            pattern++;
            ct++;
            text++;

        }
            else
        {
           text++;
        }

    }

        if ( ct == numberofcharacters )
    {
            return(1);
    }
        else
    {
            return(0);
    }


}

Это был первый цикл, который был проблематичным, потому что, как упоминалось в разделе комментариев, он полностью изменил шаблон переменной на ноль, поэтому сравнивать было не с чем.Этот код отлично работает.

0 голосов
/ 11 декабря 2018

при условии это проблема с домашней работой, или вы учитесь, рассмотрите эту версию для начинающих:

int isIncluded ( char *text, char *pattern );   /* this is ok */
/* 
   can also write it this way

   int isIncluded ( char text[], char pattern[] );
*/

int main ( void )
{

    char text[30];
    char pattern[30];
    int result;

    printf(" Please introduce your text \n");
    scanf("%s", text);        /* don't use &text here */

    printf(" Please introduce the pattern you are looking for \n");
    scanf("%s", pattern);    /* don't use &pattern here */

    /* don't pass a pointer to a pointer, the strings text and pattern are already pointers, you passing &text would mean isIncluded( char **text ) */

    result = isIncluded( text, pattern );

    if ( result == 1 )
    {
        printf(" Your pattern has been found in your text \n " ) ;
    }
    else if ( result == 0 )
    {
        printf(" no substring found \n " ) ;
    }
    else
    {
        /* don't overlook possibilities of missing simple stuff by not making use of else with  if statements */
        printf(" Error: value of result is %d\n", result );
    }
}

Я не изучал, почему isIncluded всегда возвращает ноль, нопередача указателя на указатель на него не помогает.

Если вам это нравится, возможно, я напишу частичный код, чтобы вы начали, но то, что вы хотите сделать, уже полностью выполнено при условии strstr()по # include <string.h>

также, , определяющий char text[30], является тем же самым, что и , определяющий указатель на тип char , называемый текстом, но кроме того он резервирует место в памяти для хранения[n] символов, которые вы назвали 30. В этом случае может быть полезно понять разницу между определением и объявлением в дополнение к тому, что на самом деле происходит при выполнении text[3]против *(text+3) оба они действительны, однозначны и делают одно и то же.

0 голосов
/ 11 декабря 2018

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

Другая проблема в этой функции в условии окончания паттерна в секунду, в то время как цикл должен использовать *pattern != '\0' вместо pattern != '\0'

и когда вы хотите вызвать функцию с аргументом char* и у вас есть массив символов, вы должны отправить массив, и тип &text будет char**

и в конце вот что выхочу:

#include <stdio.h>

#include <stdlib.h>

int isIncluded(char *text, char* pattern);

int main()
{

    char text[30];
    char pattern[30]; int result;

    printf(" Please introduce your text \n");
    scanf("%s", &text);

    printf(" Please introduce the pattern you are looking for \n");
    scanf("%s", &pattern);



    result = isIncluded(text, pattern);

    if (result == 1)
    {

        printf(" Your pattern has been found in your text \n ");
    }
    if (result == 0)
    {

        printf(" no substring found \n ");
    }





}


int isIncluded(char *text, char* pattern)
{

    int ct = 0;
    int numberofcharacters = 0;
    char *temp = pattern;        //<- define new variable 

    while (*temp != '\0')
    {
        temp++;
        numberofcharacters++;

    }

    while (*text != '\0' && *pattern != '\0')
    {
        if (*pattern == *text)
        {
            pattern++;
            ct++;
            text++;

        }
        else
        {
            text++;
        }

    }

    if (ct == numberofcharacters)
    {
        return(1);
    }
    else
    {
        return(0);
    }


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