teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

解決

2020/06/02 05:50

投稿

junnnnchan
junnnnchan

スコア26

title CHANGED
File without changes
body CHANGED
@@ -1,58 +1,2 @@
1
- #include <stdio.h>
2
- #include <string.h>
3
- #include <limits.h>
4
- #include <stdlib.h>
5
-
6
- char *bm_reverse_text_match(char *pat , char *txt){
7
- char *pt;
8
- char *pp;
9
- char swap;
10
- int txt_len = strlen(txt);
11
- int pat_len = strlen(pat);
12
- int skip[UCHAR_MAX + 1];
13
- int i;
1
+ 解決した
14
-
15
- for (i = 0; i<= UCHAR_MAX; i++)
16
- skip[i] = pat_len;
17
- for(pp = pat;*pp != '\n'; pp++)
18
- skip[*pp] = strlen(pp) - 1;
19
- skip[*(pp-1)] = pat_len;
20
- ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
21
- pt = txt + pat_len - 1; //書き直しました。しかしこれでもコアダンプと出てしまいます
22
- for (i = 0; i < strlen(txt) / 2; i++) {
23
- char swap = *(txt + i);
24
- *(txt + i) = *(txt + txt_len - i - 1); //ここが入れ替えてる場所です
25
- *(txt + txt_len - i - 1) = swap;
26
- }
27
- ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
2
+ ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
28
- while(pt < txt + txt_len){
29
- pp = pat + pat_len - 1;
30
- while(*pt == *pp){
31
- if(pp == pat) return (pt);
32
- pp--;
33
- pt--;
34
- }
35
- pt += (skip[*pt]>strlen(pp))?skip[*pt] : strlen(pp);
36
- }
37
- return (NULL);
38
- }
39
-
40
- int main(void){
41
- char *s;
42
- char s1[80];
43
- char s2[80];
44
-
45
- printf("テキスト:");
46
- scanf("%s",s1);
47
- printf("パターン:");
48
- scanf("%s",s2);
49
- s = bm_reverse_text_match(s2,s1);
50
- if(s==NULL)
51
- puts("テキスト中にパターンは存在しません。");
52
- else
53
- printf("%d文字目に見つかりました。\n",s-s1+1);
54
- return (0);
55
- }
56
-
57
- 実行すると、Segmentation fault(コアダンプ)と出てきます
58
- 適切に実行を行うにはコードをどう書き直せばよいでしょうか

1

問題個所の修正

2020/06/02 05:50

投稿

junnnnchan
junnnnchan

スコア26

title CHANGED
File without changes
body CHANGED
@@ -11,26 +11,20 @@
11
11
  int pat_len = strlen(pat);
12
12
  int skip[UCHAR_MAX + 1];
13
13
  int i;
14
- /*
14
+
15
- for(i = 0; i <strlen(txt)/2; i++){
16
- char swap = *(pt+i);
17
- *(pt+i) = *(pt + txt_len - i);
18
- *(pt + txt_len - i) = swap;
19
- }
20
- */
21
15
  for (i = 0; i<= UCHAR_MAX; i++)
22
16
  skip[i] = pat_len;
23
17
  for(pp = pat;*pp != '\n'; pp++)
24
18
  skip[*pp] = strlen(pp) - 1;
25
19
  skip[*(pp-1)] = pat_len;
20
+ ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
26
- ---------------------------------------------------------------
21
+ pt = txt + pat_len - 1; //書き直しました。しかしこれでもコアダンプと出てしまいます
27
- for(i=0;i<strlen(txt)/2;i++){
22
+ for (i = 0; i < strlen(txt) / 2; i++) {
28
- char swap = *(pt+i);
23
+ char swap = *(txt + i);
29
- *(pt+i) = *(pt + txt_len - i); //ここが入れ替えてる場所です
24
+ *(txt + i) = *(txt + txt_len - i - 1); //ここが入れ替えてる場所です
30
- *(pt + txt_len - i) = swap;
25
+ *(txt + txt_len - i - 1) = swap;
31
- }
26
+ }
32
- ------------------------------------------------------------
33
- pt = txt + pat_len - 1;
27
+ ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
34
28
  while(pt < txt + txt_len){
35
29
  pp = pat + pat_len - 1;
36
30
  while(*pt == *pp){