2017-01-05 25 views
-3

文字列s1の各文字を、文字列s2のいずれかの文字と一致する文字を削除しようとしました。 スクイーズメソッドのテストコードは次のとおりです。なぜセグメンテーションフォルト:11がCコードで発生しましたか?

#include <stdio.h> 

void squeeze(char s1[], char s2[]); 

int main() 
{ 
    char s1[20] = "HelloWorld", s2[20] = "ol"; 
    squeeze(s1, s2); 
    printf("%s\n", s1); 
    return 0; 
} 

void squeeze(char s1[], char s2[]) 
{ 
    int i, j, k; 
    k = 0; 
    for (i = 0; s1[i] != '\0'; ++i) { 
     for (j = 0; s2[j] != '\0'; ++j) { 
      if (s1[i] != s2[j]) 
       s1[k++] = s1[i]; 
     } 
    } 
    s1[k] = '\0'; 
} 

私はこのコードを実行すると、端末は常にSegmentation fault: 11を与えます。 誰も私にこのようなことが起こる理由を教えてもらえますか?

+2

を参照してください新しい配列を使用してみてください、あなたのインデント –

+3

あなたをデバッグしてみてくださいを修正してくださいコード! –

+1

@kiner_shahに同意する - デバッガの使い方を学ぶ必要があります。ここでの問題は、 'k'の値が' s1'配列の終わりを超えていることです。 –

答えて

0

例:あなたのコードで

#include <stdio.h> 

static int found(char *str, char c) { // return 1 if c is found in str 
    for (size_t i = 0; str[i] != '\0'; i++) { 
    if (str[i] == c) { 
     return 1; 
    } 
    } 
    return 0; 
} 

static void squeeze(char *a, char *b) { 
    size_t k = 0; 
    for (size_t i = 0; a[i] != '\0'; i++) { // use size_t to iterate on a c-string 
    if (found(b, a[i]) != 1) { 
     a[k++] = a[i]; // copy only if a[i] is not in b 
    } 
    } 
    a[k] = '\0'; 
} 

int main(void) { 
    char a[] = "HelloWorld"; // you should let auto size 
    char b[] = "ol";   // and separate declaration 

    squeeze(a, b); 

    printf("%s\n", a); 
} 
0

問題はs1[k++] = s1[i];

ある

は、次のコード

#include<stdio.h> 

char *squeeze(char s1[], char s2[]); 

int main() 
{ 
    char s1[20] = "HelloWorld", s2[20] = "olH"; 

    squeeze(s1, s2); 

    return 0; 
} 


char *squeeze(char s1[], char s2[]) 
{ 
    int i, j, k; 

    k = 0; 

    char arr[100]; // new array 

    int flag = 0; 
    for (i = 0; s1[i] != '\0'; i++) { 
     flag = 0; 

     for (j = 0; s2[j] != '\0'; ++j) { 
      if (s1[i] == s2[j]) 
      { 
       flag = 1; 
       break; 
      } 
     } 

     if (flag == 0) 
     { 
      arr[k++] = s1[i]; 
     } 
    } 

    arr[k] = '\0'; 

    printf("%s",arr); 
} 
関連する問題