Поиск подстроки в строковой функции дает неправильные значения - PullRequest
0 голосов
/ 13 февраля 2019

Я создал программу, которая ведет себя странным образом - я не уверен, почему она дает неправильные значения.Например, когда я использую ввод: ("болтун", "шляпа"), он работает правильно:

    The starting position is 3.
String 'hat' occured for 1 time(s).

Но если я удаляю пробел ("ахтербокс", "шляпа"), он показывает:

String 'hat' occured for 0 time(s).

Объяснение упражнения:

/ * Напишите функцию с именем findString (), чтобы определить, существует ли одна строка символов внутри другой строки.Первым аргументом функции должна быть строка символов, которую необходимо найти, а вторым аргументом является строка, которую вы хотите найти.Если функция находит указанную строку, она должна вернуть местоположение в исходной строке, где была найдена строка.Если функция не находит строку, верните ее -1.Так, например, вызов Нажмите здесь, чтобы посмотреть код изображения index = findString ("болтун", "шляпа");ищет в строке "болтун" строку "шляпа".Поскольку внутри исходной строки существует «шляпа», функция возвращает 3, чтобы указать начальную позицию внутри исходной строки, где была найдена «шляпа».* /

Мой код:

#include <stdio.h>
#include <string.h>
#include <stdbool.h>

int findString (char motherArgument[], char childArgument[]);


int main(int argc, char const *argv[])
{

    printf("%s",findString ("a chatterbox", "hat")); //why if I remove space ' ' this does not work, why?
     return 0;
}


int findString (char motherArgument[], char childArgument[]) // is child inside the mother? 
{

    int i, flag = false, freq = 0;

    for (i = 0; i < strlen(motherArgument); i++) // going through mother
  {
    if(motherArgument[i] == childArgument[i]) //  chars equal?
    {
        flag = true;
        printf("The starting position is %d.", i - 1); // i -1 to get 3 as in the example
        freq++; // frequency
    }

  }
    if (flag = true) 
      {
         printf("\nString '%s' occured for %d time(s).\n", childArgument, freq);    
      }

        else
            {
                printf("None\n"); // false = none
                return -1;
            }


}

Что я делаю не так?Должен ли я вводить данные другим способом?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Я вижу две проблемы с вашим кодом, вашей findString() функцией и вашей main() функцией.Программируя тест, давайте сначала разберемся с вашей main() функцией.Предполагается, что findString() возвращает строку, но не возвращает - int.Итак, нам нужно что-то вроде:

int main(int argc, char const *argv[])
{
    char *string = "a chatterbox";

    int index = findString(string, "hat");

    if (index != -1)
    {
        printf("%s\n", string + index);
    }

    return 0;
}

Теперь обратимся к вашей findString() функции, как правильно заметили @FredK и @Barmar, это не правильно:

if(motherArgument[i] == childArgument[i])

Но смотреть дальшевот что это значит:

freq++; // frequency

Ничто в вашей спецификации проблемы не упоминает счетчик частоты.Затем есть переменная flag, для которой вы include <stdbool.h> и в любом случае объявляете ее int.Кажется, для управления печатью, которой нет в спецификации.Наконец, вы возвращаете -1 в случае неудачи, но не возвращаете ничего явно в случае успеха!

Давайте попробуем минимальную и слегка нарушенную реализацию findString():

int findString(const char *string, const char *substring)
{
    for (int i = 0; i < strlen(string); i++)
    {
        if (strncmp(string + i, substring, strlen(substring)) == 0)
        {
            return i;
        }
    }

    return -1;
}

Шансытеперь вы скажете нам, что вам не разрешено использовать strncmp().В любом случае, теперь у вас есть базовая модель взаимодействия этих подпрограмм и заполнения кода по мере необходимости.Наряду с обычной отладкой и тестированием, задайте себе вопросы при программировании:

Что если одна или обе строки аргумента являются пустой строкой?Или такая же строка?Что происходит, если подстрока длиннее строки?Правильны ли наши ограничения цикла или мы можем сделать лучше?

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

0 голосов
/ 13 февраля 2019
if(motherArgument[i] == childArgument[i])

Это не правильно.Вы не должны использовать один и тот же индекс для обеих строк.

Выполняйте поиск motherArgument, пока не найдете символ, соответствующий ПЕРВОМУ символу childArgument.Если найдено, продолжайте проверять, равны ли последующие символы двух строк.

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