セグメンテーション違反について教えてください。
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 }
お礼
すみません^^; プログラムを載せようとしたんですが、長くて字数オーバーしてしまいました。 問題は解決されました。 今度なにかあった場合はちゃんとプログラムを載せようと思っています。 ご回答ありがとうございましたm(_ _)m