Нарушение прав доступа при чтении по адресу - C (СИ)
Формулировка задачи:
Здраствуйте,
задано переписать функцию strspn(canst char *s1, const char *s2) так чтоб она искала самый длинный фрагмент строчки s1, содержащий только елементы строчки s2, при этом фрагмент не обязательно расположен в начале строчки.
Признаюсь честно я не сильно дружу з си(особенно с указателями), но пришлось вспоминать чтоб сделать задание.
Значит выбрал я следующий алгоритм: сравниваем каждый елемент строчки s1 со всеми елементами строчки s2, находя совпадение запускаем рекурсивно функцию подсчета фрагмента одинаковых елементов от оставшейся части строчки s1 и строчки s2.
Ошифка возникает при выделении оставшейся части строчки s1 в строке 56
Сперва подумал про возможный выход за пределы, сделал обработчик через if перед переписыванием, но ошибка осталась.
(так же уверен что в строке 25 будет такая же ошибка, но програма туда просто не доходит пока)
Подскажите что может быть не верно и где исправить или же как оптимизировать даный кусок коду.
#include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale> int temp = 0; int max = 0; void count(const char *s1, const char *s2) { temp++; int i, j; for (i = 0; i < strlen(s2); i++) { if ((s1[0] == s2[i]) && (s2[i] != '\n')) { int i1; char s1_tmp[100]; int k = 0; if (1 < strlen(s1)) { for (i1 = 1; i < strlen(s1); i1++) { s1_tmp[k] = s1[i1]; k++; } count(s1_tmp, s2); } else { count((const char*)s1[0], s2); } } } if (temp > max) max = temp; temp = 0; } void StrSpn(const char *s1, const char *s2) { const char *start = s1; int i, j; for (i = 0; i < strlen(s1); i++) { for (j = 0; j < strlen(s2); j++) { if ((s1[i] == s2[j]) && (s1[i] != '\n')) { int i1; char s1_tmp[100]; int k = 0; if (i + 1 < strlen(s1)) { for (i1 = i + 1; i < strlen(s1); i1++) { s1_tmp[k] = s1[i1]; k++; } count(s1_tmp, s2); } else { count((const char*)s1[i], s2); } } } } } int main() { setlocale(LC_ALL, "ukr"); char s[100]; char s1[100]; int i, cur = 0; printf("Enter first string: "); fgets(s, 80, stdin); char sfirst = s[0]; if (sfirst == '\n') { printf("Error! Empty string!"); } else { printf("Enter second string: "); fgets(s1, 80, stdin); char s1first = s1[0]; if (s1first == '\n') { printf("Error! Empty string!"); } else { StrSpn(s, s1); printf("Result: %d\n", max); } } system("pause"); return 0; }
Решение задачи: «Нарушение прав доступа при чтении по адресу»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale> int temp = 0; int max = 0; void count(const char *s1, const char *s2) { temp++; int i, j; for (i = 0; i < strlen(s2); i++) { if ((s1[0] == s2[i]) && (s2[i] != '\n')) { int i1; char s1_tmp[100] = { NULL }; int k = 0; int t = strlen(s1); if (1 < strlen(s1)) { for (i1 = 1; i1 < strlen(s1); i1++) { s1_tmp[k] = s1[i1]; k++; } count(s1_tmp, s2); } else { count((const char*)s1[0], s2); } } } if (temp > max) max = temp; temp = 0; } void StrSpn(const char *s1, const char *s2) { const char *start = s1; int i, j; for (i = 0; i < strlen(s1); i++) { for (j = 0; j < strlen(s2); j++) { if ((s1[i] == s2[j]) && (s1[i] != '\n')) { int i1; char s1_tmp[100] = { NULL }; int k = 0; if (i + 1 < strlen(s1)) { for (i1 = i + 1; i1 < strlen(s1); i1++) { s1_tmp[k] = s1[i1]; k++; } count(s1_tmp, s2); } else { count((const char*)s1[i], s2); } } } } } int main() { setlocale(LC_ALL, "ukr"); char s[100]; char s1[100]; int i, cur = 0; printf("Enter first string: "); fgets(s, 80, stdin); char sfirst = s[0]; if (sfirst == '\n') { printf("Error! Empty string!"); } else { printf("Enter second string: "); fgets(s1, 80, stdin); char s1first = s1[0]; if (s1first == '\n') { printf("Error! Empty string!"); } else { StrSpn(s, s1); printf("Result: %d\n", max); } } system("pause"); return 0; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д