Как найти первое вхождение строки и вернуть всю строку(в которой искали) до конца с места вхождения?

234
18 июля 2017, 20:04

Учу С++ по книге Страуструпа, есть такое задание в конце главы : "Напишите функцию char* findx(const char* s, const char* х) , нахо* дящую первое вхождение С-строки х в строку s." Я решил, что раз уже там тип возвращаемого результат char*, то функция должна возвращать оставшуюся строку. Найти первое вхождение строки могу, но вот вернуть потом исходную строку с даного места не получается.

#include <iostream>
#include "header.h"
using namespace std;

int main() {
    char* str_f = { "Hello, what's your name?" };
    char* str_s = { "your name?" };

    cout << findx(str_f, str_s);
    system("pause");
    return 0;
}
int findx(const char* s, const char* x) {
    for (int i = 0; i < strlen(s); i++) {
        if (s[i] == x[0]) {
            int k = i;
            for (int j = 0; s[k] == x[j]; j++, k++) {
                if (j == strlen(x)) return i+1;
            }
        }   
    }
    return -1;
}

Сделал тип int, чтобы проверить правильного ли ищет первое вхождение строки в подстроку.

Answer 1
int findx(const char* s, const char* x) {
    for (size_t i = 0; i < strlen(s); i++) {
        if (s[i] == x[0]) {
            int k = i;
            for (size_t j = 0; s[k] == x[j]; j++, k++) {
                if (j == strlen(x) - 1) return i;
            }
        }
    }
    return -1;
}
const char* findch(const char* s, const char* x) {
    int pos = findx(s, x);
    return pos == -1 ? nullptr : s + pos;
}

Вызов в main: cout << findx(str_f, str_s) << endl; cout << findch(str_f, str_s) << endl;

Answer 2

Преобразовываем const char* в char* помощью const_cast<>, но лучше возвращать const char* и не использовать const_cast<>, если не хотим изменять константную С-строку

char* findx(const char* s, const char* x)
{
    char* r = nullptr;
    int length = strlen(x);
    int n = 0;
    int occurrence_len = 0;
    while (s[n]) {
        if (s[n] == *x) { //*x == x[0]
            for (int i = 0; i < length; ++i)
                if (s[n + i] == x[i]) ++occurrence_len;
            if (occurrence_len == length) { //нашли подстроку
                r = const_cast<char*>(&s[n]); //отбрасываем const
                return r; 
            }
            else
                occurrence_len = 0; //сбрасывем счетчик
        }
        ++n;
    }
    //если ничего не нашли, возвращем целую строку s
    r = const_cast<char*>(s);
    return r;
}
READ ALSO
Не могу разобраться с работой qt_wrap_ui (cmake qt)

Не могу разобраться с работой qt_wrap_ui (cmake qt)

Я только начал изучать QtИспользую clion и соответственно cmake

281
Компиляция C/C++ вместе с Python

Компиляция C/C++ вместе с Python

Программа написана на С, часть кода на python

275
Обновление содержимого объекта

Обновление содержимого объекта

Пользователь оценивает фотографиюAjax Иконка Like изначально серого цвета, после выполнения успешного Ajax-запроса должна стать розового цвета...

268