Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
sir_drake
0 / 0 / 1
Регистрация: 18.03.2017
Сообщений: 2
1

Нарушение прав доступа при чтении по адресу

18.03.2017, 19:14. Просмотров 407. Ответов 1

Здраствуйте,
задано переписать функцию strspn(canst char *s1, const char *s2) так чтоб она искала самый длинный фрагмент строчки s1, содержащий только елементы строчки s2, при этом фрагмент не обязательно расположен в начале строчки.

Признаюсь честно я не сильно дружу з си(особенно с указателями), но пришлось вспоминать чтоб сделать задание.

Значит выбрал я следующий алгоритм: сравниваем каждый елемент строчки s1 со всеми елементами строчки s2, находя совпадение запускаем рекурсивно функцию подсчета фрагмента одинаковых елементов от оставшейся части строчки s1 и строчки s2.

Ошифка возникает при выделении оставшейся части строчки s1 в строке 56
Сперва подумал про возможный выход за пределы, сделал обработчик через if перед переписыванием, но ошибка осталась.
(так же уверен что в строке 25 будет такая же ошибка, но програма туда просто не доходит пока)

Подскажите что может быть не верно и где исправить или же как оптимизировать даный кусок коду.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#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;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2017, 19:14
Ответы с готовыми решениями:

Нарушение прав доступа при чтении по адресу
#define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf #include &lt;stdio.h&gt;...

0xC0000005: нарушение прав доступа при чтении по адресу 0x00000003
Доброго времени суток!Возникла проблема при вводе в консоль массива , после ввода элементов консоль...

Программа тасовки колоды карт: Нарушение прав доступа при чтении по адресу
Всем доброго времени суток. Помогите найти ошибку. Ни на что не ругается, просто выдает ошибку. ...

Нарушение прав доступа при чтении Си
В общем, стабильно решаю 1 проблему и получаю 2 новых. В конце при вводе товара для поиска выходит...

Нарушение прав доступа при чтении
Список. Не могу разобраться с двумя функциями, компилятор не находит синтаксических ошибок, а во...

1
sir_drake
0 / 0 / 1
Регистрация: 18.03.2017
Сообщений: 2
21.03.2017, 07:25  [ТС] 2
Сам разобрался и сделал, если кому интересно вот работающий код:
код
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#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;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2017, 07:25

Ошибка Нарушение прав доступа при чтении
Вот код на Pure C: #include &lt;stdio.h&gt; void getchrs(int a); int ceven(int a); main(void){ int...

Нарушение прав доступа при записи по адресу 0x00007430
Подскажите, пожалуйста, почему при выполнении программы появляется Вызвано исключение по адресу...

Ошибка: нарушение прав доступа при записи по адресу
Надо написать следующую программу: дан символьный массив из 101 элемента. По спецификации %s...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru