Выражение должно иметь тип класса при использовании указателей - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь подсчитать в строке1, сколько раз существует строка2.Например: строка1 = abababd.string2 = ab.Результат: 3.

(я должен использовать указатели для этого вопроса)

Что у меня есть:

int mystr(char* s, char* t) {
    int counter = 0;
    int length = strlen(t);
    while (*s != '\0')
    {
        char d[] = *s.substr(0, 2);
        if (*s == *t)
            counter++;
        *s += length;
    }
    return counter;
}

Я продолжаю получать сообщение: у выражения должно быть классвведите для этой строки: char d [] = * s.substr (0, 2);Может кто-нибудь помочь, пожалуйста?

1 Ответ

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

substr - это метод класса std::string.

Вы используете здесь указатели C (char* s), поэтому нет substr() для вызова, таким образом, ошибка.


Конечно, я оставлю реализацию вам, но вы можете вдохновиться созданием моего собственного substr .


Поскольку OP демонстрирует добросовестность в попытках сделать свое собственное HW, давайте пока прокомментируем подход:

int mystr(char* s, char* t) {
    int counter = 0;
    int length = strlen(t);
    // while we haven't reach the end of string
    while (*s != '\0')
    {
        // this is not used anywhere, and it's wrong. Why 2? You want the length of `t` there, if you would use it anyway
        char d[] = *s.substr(0, 2);

        // this is wrong. It will increase the counter,
        // every time a character of the substring is matched with the
        // current character in the string
        if (*s == *t)
            counter++;

        // you want to read the next chunk of the string, seems good for a start
        *s += length;
    }
    return counter;
}

Итак, теперь вы должны сосредоточиться на том, как проверить, является ли текущийподстрока совпадает в строке.Итак, вам нужно изменить это:

if (*s == *t)
    counter++;

на что-то, что будет проверять все символы t, против того же количества символов строки, с текущей позиции.Итак, вам нужно повторить до *s.Сколько раз? Для , равной длине t.

В этой итерации вам необходимо проверить, что текущий символ строки s равен по сравнению равным к текущему символу строки t.Когда итерация заканчивается, и если все символы, посещенные во время этой итерации, совпадают, это означает, что вы нашли совпадение!Итак, , если это правда, тогда мы должны увеличить счетчик.


Бонус: если у вас есть время и вы выполнили логикуОбсуждаемое выше, подумайте о *s += length; и этих входных данных: `s =" dabababd ", t =" ab ".

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