セグメンテーション違反について教えてください。
2つの文字列s、tを入力して 、sの中からtを検索し、一致したらsからtを削除したものを結果に出すという問題です。たとえば、s = a v a b c a 、t = a b c とすると、sからa b cが削除され、a v aと結果が表示されます。
ちなみに条件として、s、tとも配列の大きさが80となっており、出力用の文字列out[ ]も同様です。
また、文字列の入力は50字に制限されています。
ロジックを何とかつかんだ後、以下のようにコードで書いたのですが、セグメンテーション違反になってしまいます。
(1)まず、2行何か書かなければ「文字列を入力して下さい」が表示されません。
(2)「文字列を入力して下さい」「削除する文字列を入力したください」は表示されますが、その後の「削除後の文字列」とその結果が表示されません。
(3)その代わり、セグメンテーション違反が出ます。
たとえば、こんな感じで表示されてしまいました。
/************************************************/
12
12
文字列を入力して下さい。(50字) :asd
削除する文字列を入力して下さい。(削除) :a
セグメンテーション違反です
/************************************************/
このとき、どこを直せばいいのでしょうか?
1 #include <stdio.h>
2 #include <string.h>
3
4 #define NULLB '0' /* 入力制限 */
5
6 int main(int argc , char *argv[])
7 {
8 /*********各変数の宣言*********/
9 char s[80] ;
10 char t[80] ;
11 char out[80] ;
12 int s_len ;
13 int t_len ;
14 int out_len ;
15 int s_index ;
16 int t_index ;
17 int out_index ;
18
19 /******************************/
20
21 fgets(s , 50 , stdin) ;
22 fgets(t , 80 , stdin) ;
23
24
25 printf("文字列を入力して下さい。(50字) :" ) ;
26 scanf("%s",&s) ;
27 s_len = strlen(s) ;
28
29
30 printf("削除する文字列を入力して下さい。(削除) :") ;
31 scanf(" %s",&t) ;
32 t_len = strlen(t) ;
33
34
35 /********各変数の初期化********/
36 memset(s , '\0' , sizeof(int) *80) ;
37 memset(t , '\0' , sizeof(int) *80) ;
38 memset(out , '\0' , sizeof(int) *80) ;
39 s_index = 0 ;
40 t_index = 0 ;
41 out_index = 0 ;
42
43 /******************************/
44
45 if( s_len >= t_len)
46 {
47
48 /********外側のループ********/
49 while(s_index < s_len)
50 {
51 /********内側のループ********/
52 while(t_index < t_len)
53 {
54 if( (s_len - s_index) >= t_len)
55 {
56 if( s[s_index + t_index] == t[t_index])
57 {
58 if(t_len - t_index ==1)
59 {
60 s_index += t_len ;
61 }
62 else
63 {
64 continue ;
65 }
66 t_index ++ ;
67 }
68 else
69 {
70 out[out_index] = s[s_index] ;
71 out_index++ ;
72 s_index++ ;
73
74 break ;
75 }
76 }
77 else
78 {
79 strncpy(out, s , (s_len-s_index + 1 )) ;
80 }
81 }
82 /****************************/
83 }
84 /****************************/
85 }
86 else
87 {
88 strcpy( out, s) ;
89 }
90
91 printf("\n削除後の文字列: %s": );
92
93 return 0 ;
94 }
お礼
デバックをつけて、おかしいところを調べましたところ、やはり、すごく苦手なポインタと構造体を使っているところでした。 何とか、直すことが出来ました。 どうもありがとうございました!
補足
ありがとうございます。 OSはLinuxで、コンパイラは、そのLinuxについていたものです。 デバックを付けて、以上個所を調べてみようと思います。 ソースは、私の勝手で申し訳ないのですが、書くことが出来ません。すみません。