質問編集履歴

2

解決

2020/06/02 05:50

投稿

junnnnchan
junnnnchan

スコア26

test CHANGED
File without changes
test CHANGED
@@ -1,115 +1,3 @@
1
- #include <stdio.h>
1
+ 解決した
2
2
 
3
- #include <string.h>
4
-
5
- #include <limits.h>
6
-
7
- #include <stdlib.h>
8
-
9
-
10
-
11
- char *bm_reverse_text_match(char *pat , char *txt){
12
-
13
- char *pt;
14
-
15
- char *pp;
16
-
17
- char swap;
18
-
19
- int txt_len = strlen(txt);
20
-
21
- int pat_len = strlen(pat);
22
-
23
- int skip[UCHAR_MAX + 1];
24
-
25
- int i;
26
-
27
-
28
-
29
- for (i = 0; i<= UCHAR_MAX; i++)
30
-
31
- skip[i] = pat_len;
32
-
33
- for(pp = pat;*pp != '\n'; pp++)
34
-
35
- skip[*pp] = strlen(pp) - 1;
36
-
37
- skip[*(pp-1)] = pat_len;
38
-
39
- ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
40
-
41
- pt = txt + pat_len - 1; //書き直しました。しかしこれでもコアダンプと出てしまいます
42
-
43
- for (i = 0; i < strlen(txt) / 2; i++) {
44
-
45
- char swap = *(txt + i);
46
-
47
- *(txt + i) = *(txt + txt_len - i - 1); //ここが入れ替えてる場所です
48
-
49
- *(txt + txt_len - i - 1) = swap;
50
-
51
- }
52
-
53
- ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
3
+ ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
54
-
55
- while(pt < txt + txt_len){
56
-
57
- pp = pat + pat_len - 1;
58
-
59
- while(*pt == *pp){
60
-
61
- if(pp == pat) return (pt);
62
-
63
- pp--;
64
-
65
- pt--;
66
-
67
- }
68
-
69
- pt += (skip[*pt]>strlen(pp))?skip[*pt] : strlen(pp);
70
-
71
- }
72
-
73
- return (NULL);
74
-
75
- }
76
-
77
-
78
-
79
- int main(void){
80
-
81
- char *s;
82
-
83
- char s1[80];
84
-
85
- char s2[80];
86
-
87
-
88
-
89
- printf("テキスト:");
90
-
91
- scanf("%s",s1);
92
-
93
- printf("パターン:");
94
-
95
- scanf("%s",s2);
96
-
97
- s = bm_reverse_text_match(s2,s1);
98
-
99
- if(s==NULL)
100
-
101
- puts("テキスト中にパターンは存在しません。");
102
-
103
- else
104
-
105
- printf("%d文字目に見つかりました。\n",s-s1+1);
106
-
107
- return (0);
108
-
109
- }
110
-
111
-
112
-
113
- 実行すると、Segmentation fault(コアダンプ)と出てきます
114
-
115
- 適切に実行を行うにはコードをどう書き直せばよいでしょうか

1

問題個所の修正

2020/06/02 05:50

投稿

junnnnchan
junnnnchan

スコア26

test CHANGED
File without changes
test CHANGED
@@ -24,19 +24,7 @@
24
24
 
25
25
  int i;
26
26
 
27
- /*
28
27
 
29
- for(i = 0; i <strlen(txt)/2; i++){
30
-
31
- char swap = *(pt+i);
32
-
33
- *(pt+i) = *(pt + txt_len - i);
34
-
35
- *(pt + txt_len - i) = swap;
36
-
37
- }
38
-
39
- */
40
28
 
41
29
  for (i = 0; i<= UCHAR_MAX; i++)
42
30
 
@@ -48,21 +36,21 @@
48
36
 
49
37
  skip[*(pp-1)] = pat_len;
50
38
 
51
- ---------------------------------------------------------------
39
+ ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
52
40
 
53
- for(i=0;i<strlen(txt)/2;i++){
41
+ pt = txt + pat_len - 1; //書き直しました。しかしこれでもコアダンプと出てしまいます
54
42
 
55
- char swap = *(pt+i);
43
+ for (i = 0; i < strlen(txt) / 2; i++) {
56
44
 
57
- *(pt+i) = *(pt + txt_len - i); //ここが入れ替えてる場所です
45
+ char swap = *(txt + i);
58
46
 
59
- *(pt + txt_len - i) = swap;
47
+ *(txt + i) = *(txt + txt_len - i - 1); //ここが入れ替えてる場所です
60
48
 
61
- }
49
+ *(txt + txt_len - i - 1) = swap;
62
50
 
63
- ------------------------------------------------------------
51
+ }
64
52
 
65
- pt = txt + pat_len - 1;
53
+ ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
66
54
 
67
55
  while(pt < txt + txt_len){
68
56