Поиск первой строки во второй строке без указателей в C - PullRequest
0 голосов
/ 15 марта 2019

Я новичок в изучении языка Си. Мой учитель сказал, что мы должны написать проект для: Найти вторую строку в первой строке без указателя (*). До сих пор я изучал циклы, условия, функции и массивы, и они являются моими единственными вариантами. Этот проект должен получать строки от пользователя на двух уровнях. Проверьте их и распечатайте результат.

А пока я написал что-то вроде чуши:

int main()
{

        char source[MAX_STR_LEN];
        char target[MAX_STR_LEN];
        int len = 50;
        int a;
        scanf("%s", &source);
        scanf("%s", &target);

        for (int i = 0; i <= len; i++)
        {

            if (strncasecmp(source[i], target[i], strlen(target)) == 0)
            {
                int a = 1;
                if (a == 1)
                {
                    printf("%s is inner of %s", target, source);
                }
                else
                {
                    printf("%s is NOT inner of %s", target, source);
                }
            }
        }


      return 0;
}

но мой проект ничего не печатает и закрывается автоматически, когда я ввожу две строки. Я уверен, что мой код не соответствует действительности. Есть ли простой способ сделать это? Спасибо

Ответы [ 3 ]

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

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

strstr, выполняя эту работу.

Ниже мой код, я добавил комментарий к вашему коду

#include <stdio.h>
#include <strings.h>

#define MAX_STR_LEN 50

int main(void)
{

     char source[MAX_STR_LEN];
     char target[MAX_STR_LEN];
    //int len = 50;
    //int a;
    scanf(" %s", source);   //char array name is used like pointer to the first element of array
    scanf(" %s", target);

    char* ret = NULL;

    ret = strstr(source, target);

    if(ret == NULL)
        printf("%s is NOT inner of %s", target, source);
    else
        printf("%s is inner of %s", target, source);

  return 0;
}
0 голосов
/ 15 марта 2019

Брат, вы присваиваете значение int a = 1; и сразу после проверки if(a == 1), что не имеет смысла, потому что else{printf("%s is NOT inner of %s", target, source);} эта часть кода выше никогда не будет использоваться в этом сценарии, это решение https://www.geeksforgeeks.org/given-two-strings-find-first-string-subsequence-second/be осторожно:)

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

Очень простой подход заключается в простой проверке исходной строки символ за символом, чтобы увидеть, найдена ли целевая строка.Другими словами:

  • проверить, присутствует ли целевая строка, начиная с источника [0].
  • , если нет: проверить, присутствует ли целевая строка, начиная с источника [1].
  • если нет: проверьте, присутствует ли целевая строка, начиная с источника [2].
  • и так далее, пока не достигнете конца строки источника.

Это можно сделать, используя два цикла for, где внешний цикл повторяет все символы в исходной строке, а внутренний цикл повторяет целевую строку при сравнении символов в двух строках.

Вы можете визуализировать это следующим образом:

source: Hello World
target: lo

Hello World
lo           // No match: He != lo

Hello World
 lo          // No match: el != lo

Hello World
  lo         // No match: ll != lo

Hello World
   lo        // Match: lo != lo

Простая реализация может выглядеть так:

int main()
{

    char source[MAX_STR_LEN] = "Hello World";
    char target[MAX_STR_LEN] = "lo";

    int source_index = 0;
    int match = 0;
    while (source[source_index] != '\0')
    {
        int target_index = 0;
        while (target[target_index] != '\0' &&
               source[source_index + target_index] != '\0' && 
               source[source_index + target_index] == target[target_index])
        {
            ++target_index;
            if (target[target_index] == '\0')
            {
                match = 1;
                break;
            }
        }
        if (match) break;
        ++ source_index;
    }
    if (match)
    {
        printf("found\n");
    }
    else
    {
        printf("not found\n");
    }

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