- 締切済み
セグメンテーション違反について教えてください。
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 }
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- kb-nike
- ベストアンサー率36% (72/200)
できるだけ質問者さんの作風に従ってコーディングしてみました。 変更点は質問者さんのほうでチェックしてみてください。 //-------------------------------------------------------------------- #include <stdio.h> #include <string.h> int main( int argc, char *argv[] ) { /*********各変数の宣言*********/ char s[80]; char t[80]; char out[80]; int s_len, t_len, out_len; int s_index, t_index; int k; printf("文字列を入力して下さい。(50字) :"); scanf("%s", s) ; s_len = strlen(s) ; printf("削除する文字列を入力して下さい。(削除) :"); scanf("%s", t) ; t_len = strlen(t) ; if(s_len < t_len){ printf("削除する文字列が長すぎます。\n"); return 0; } s_index = 0; while(s[s_index]){ k = 0; t_index = 0; while(t[t_index]){ if(s[s_index + k] == t[t_index]){ k ++; t_index ++; } else{ break; } } if(k == t_len){ break; } else{ s_index ++; } } strcpy(out, s); out[s_index] = '\0'; strcat(out, &s[s_index + k]); printf("削除後の文字列: %s\n", out); return 0; }
- m-take0220
- ベストアンサー率60% (477/782)
全部は見てないが、 > (1)まず、2行何か書かなければ「文字列を入力して下さい」が表示されません。 21 fgets(s , 50 , stdin) ; 22 fgets(t , 80 , stdin) ; これがあるので、正常な動作です。 36 memset(s , '\0' , sizeof(int) *80) ; 37 memset(t , '\0' , sizeof(int) *80) ; 38 memset(out , '\0' , sizeof(int) *80) ; s,t,outはchar型の配列ですよね。sizeof(char)とsizeof(int)が違えば、問題がありますよね。
- Tacosan
- ベストアンサー率23% (3656/15482)
........ プログラムが上の方から順に実行されるってことすら知らない?