кодесурса
«C

Упражнения на C: Найти индекс первого вхождения данной строки в другой данной строке

script1adsense2code
script1adsense3code

Практика программирования C: Упражнение 14 с решением

Напишите C-программирование, чтобы найти индекс первого вхождения данной строки в другой данной строке. Если не найдено, верните -1.

Код C:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int sub_str_func(char *main_str, char *sub_str)
{
    if (main_str == NULL || sub_str == NULL) {
        return -1;
    }
    int main_len = strlen(main_str);
    int sub_len = strlen(sub_str);
    if (main_len < sub_len) {
        return -1;
    }
    if (sub_len == 0) {
        return 0;
    }
    int i, j;
    int bad_steps[128];
    for (i = 0; i < 128; i++) {
        bad_steps[i] = sub_len;
    }
    for (i = 0; i < sub_len; i++) {
        bad_steps[sub_str[i]] = sub_len - 1 - i;
    }
    int *good_steps = malloc(sub_len * sizeof(int));
    for (i = 0; i < sub_len; i++) {
        good_steps[i] = sub_len;
        for (j = i - 1; j >= 0; j--) {
            if (!memcmp(sub_str + i, sub_str + j, sub_len - i)) {
                good_steps[i] = i - j;
                break;
            }
        }
    }
    char *p = main_str + sub_len - 1;
    char *q = sub_str + sub_len - 1;
    char *r = p;
    while (p - main_str < main_len) {
        int step = 0;
        for (i = 1; i <= sub_len && *p == *q; i++) {
            if (q == sub_str) {
                return p - main_str;
            }
            if (good_steps[sub_len - i] > step) {
                step = good_steps[sub_len - i];
            }
            p--;
            q--;
        }
        if (i == 1 && bad_steps[*p] > step) {
            step = bad_steps[*p];
        }
        r += step;
        p = r;
        q = sub_str + sub_len - 1;
    }
    return -1;
}
static int strStr(char *main_str, char *sub_str)
{
    unsigned int main_len = strlen(main_str);
    unsigned int sub_len = strlen(sub_str);
    if (sub_len == 0) {
        return 0;
    }
    int i, j;
    for (i = 0; i < main_len; i++) {
        int found = 1;
        if (main_str[i] == sub_str[0]) {
	    for (j = 1; j < sub_len; j++) {
                if (i + j < main_len) {
                    if (main_str[i + j] != sub_str[j]) {
                        found = 0;
                        break;
                    }
                } else {
                    return -1;
                }
	    }
	    if (found) {
    		return i;
    	    }
	}
    }
    return -1;
}
int main(void)
{
   	char main_str[] ="w3resource.com";
	char sub_str[] ="source";
	printf("\nMain string: %s",main_str);
	printf("\nSubstring searched in main string: %s",sub_str);
    printf("\nStarting position of the substring in the main string: %d", sub_str_func(main_str, sub_str));
    return 0;
}

Пример вывода:

 Основная строка: w3resource.com
Поиск подстроки в основной строке: источник
Начальная позиция подстроки в основной строке: 4

Иллюстрированная презентация:

«C

Блок-схема: 1

«C

Блок-схема: 2

«C

Решение

Внесите свой код и комментарии через Disqus.

Previous: написать программу на C, чтобы удалить все экземпляры заданного значения в заданном массиве целых чисел и вернуть длину нового массива.
Далее: Напишите программирование на C, чтобы разделить два заданных целых числа без использования умножения, деления и оператора мод. Вернуть частное после деления.

Каков уровень сложности этого упражнения?

Новый контент: Composer: менеджер зависимостей для PHP , R программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code