Нарушение прав доступа при чтении по адресу - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здраствуйте, задано переписать функцию strspn(canst char *s1, const char *s2) так чтоб она искала самый длинный фрагмент строчки s1, содержащий только елементы строчки s2, при этом фрагмент не обязательно расположен в начале строчки. Признаюсь честно я не сильно дружу з си(особенно с указателями), но пришлось вспоминать чтоб сделать задание. Значит выбрал я следующий алгоритм: сравниваем каждый елемент строчки s1 со всеми елементами строчки s2, находя совпадение запускаем рекурсивно функцию подсчета фрагмента одинаковых елементов от оставшейся части строчки s1 и строчки s2. Ошифка возникает при выделении оставшейся части строчки s1 в строке 56 Сперва подумал про возможный выход за пределы, сделал обработчик через if перед переписыванием, но ошибка осталась. (так же уверен что в строке 25 будет такая же ошибка, но програма туда просто не доходит пока) Подскажите что может быть не верно и где исправить или же как оптимизировать даный кусок коду.
Листинг программы
  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <locale>
  6. int temp = 0;
  7. int max = 0;
  8. void count(const char *s1, const char *s2)
  9. {
  10. temp++;
  11. int i, j;
  12. for (i = 0; i < strlen(s2); i++)
  13. {
  14. if ((s1[0] == s2[i]) && (s2[i] != '\n'))
  15. {
  16. int i1;
  17. char s1_tmp[100];
  18. int k = 0;
  19. if (1 < strlen(s1))
  20. {
  21. for (i1 = 1; i < strlen(s1); i1++)
  22. {
  23. s1_tmp[k] = s1[i1];
  24. k++;
  25. }
  26. count(s1_tmp, s2);
  27. }
  28. else
  29. {
  30. count((const char*)s1[0], s2);
  31. }
  32. }
  33. }
  34. if (temp > max) max = temp;
  35. temp = 0;
  36. }
  37. void StrSpn(const char *s1, const char *s2)
  38. {
  39. const char *start = s1;
  40. int i, j;
  41. for (i = 0; i < strlen(s1); i++)
  42. {
  43. for (j = 0; j < strlen(s2); j++)
  44. {
  45. if ((s1[i] == s2[j]) && (s1[i] != '\n'))
  46. {
  47. int i1;
  48. char s1_tmp[100];
  49. int k = 0;
  50. if (i + 1 < strlen(s1)) {
  51. for (i1 = i + 1; i < strlen(s1); i1++)
  52. {
  53. s1_tmp[k] = s1[i1];
  54. k++;
  55. }
  56. count(s1_tmp, s2);
  57. }
  58. else
  59. {
  60. count((const char*)s1[i], s2);
  61. }
  62. }
  63. }
  64. }
  65. }
  66. int main()
  67. {
  68. setlocale(LC_ALL, "ukr");
  69. char s[100];
  70. char s1[100];
  71. int i, cur = 0;
  72. printf("Enter first string: ");
  73. fgets(s, 80, stdin);
  74. char sfirst = s[0];
  75. if (sfirst == '\n') {
  76. printf("Error! Empty string!");
  77. }
  78. else
  79. {
  80. printf("Enter second string: ");
  81. fgets(s1, 80, stdin);
  82. char s1first = s1[0];
  83. if (s1first == '\n') {
  84. printf("Error! Empty string!");
  85. }
  86. else
  87. {
  88. StrSpn(s, s1);
  89. printf("Result: %d\n", max);
  90. }
  91. }
  92. system("pause");
  93. return 0;
  94. }

Решение задачи: «Нарушение прав доступа при чтении по адресу»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <locale>
  5.  
  6. int temp = 0;
  7. int max = 0;
  8.  
  9. void count(const char *s1, const char *s2)
  10. {
  11.     temp++;
  12.     int i, j;
  13.     for (i = 0; i < strlen(s2); i++)
  14.     {
  15.         if ((s1[0] == s2[i]) && (s2[i] != '\n'))
  16.         {
  17.             int i1;
  18.             char s1_tmp[100] = { NULL };
  19.             int k = 0;
  20.             int t = strlen(s1);
  21.             if (1 < strlen(s1))
  22.             {
  23.                 for (i1 = 1; i1 < strlen(s1); i1++)
  24.                 {
  25.                     s1_tmp[k] = s1[i1];
  26.                     k++;
  27.                 }
  28.                 count(s1_tmp, s2);
  29.             }
  30.             else
  31.             {
  32.                 count((const char*)s1[0], s2);
  33.             }
  34.         }
  35.     }
  36.     if (temp > max) max = temp;
  37.     temp = 0;
  38. }
  39.  
  40. void StrSpn(const char *s1, const char *s2)
  41. {
  42.     const char *start = s1;
  43.     int i, j;
  44.     for (i = 0; i < strlen(s1); i++)
  45.     {
  46.         for (j = 0; j < strlen(s2); j++)
  47.         {
  48.             if ((s1[i] == s2[j]) && (s1[i] != '\n'))
  49.             {
  50.                 int i1;
  51.                 char s1_tmp[100] = { NULL };
  52.                 int k = 0;
  53.                 if (i + 1 < strlen(s1)) {
  54.                     for (i1 = i + 1; i1 < strlen(s1); i1++)
  55.                     {
  56.                         s1_tmp[k] = s1[i1];
  57.                         k++;
  58.                     }
  59.                     count(s1_tmp, s2);
  60.                 }
  61.                 else
  62.                 {
  63.                     count((const char*)s1[i], s2);
  64.                 }
  65.             }
  66.         }
  67.     }
  68. }
  69.  
  70. int main()
  71. {
  72.     setlocale(LC_ALL, "ukr");
  73.     char s[100];
  74.     char s1[100];
  75.     int i, cur = 0;
  76.     printf("Enter first string: ");
  77.     fgets(s, 80, stdin);
  78.     char sfirst = s[0];
  79.     if (sfirst == '\n') {
  80.         printf("Error! Empty string!");
  81.     }
  82.     else
  83.     {
  84.         printf("Enter second string: ");
  85.         fgets(s1, 80, stdin);
  86.         char s1first = s1[0];
  87.         if (s1first == '\n') {
  88.             printf("Error! Empty string!");
  89.         }
  90.         else
  91.         {
  92.             StrSpn(s, s1);
  93.             printf("Result: %d\n", max);
  94.         }
  95.     }
  96.  
  97.     system("pause");
  98.     return 0;
  99. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.571 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы