2017-01-05 5 views
-3

Ich habe versucht, eine Funktion zu schreiben, die jedes Zeichen in Zeichenfolge s1 löscht, die mit einem beliebigen Zeichen in der Zeichenfolge s2 übereinstimmt. Hier ist der Testcode für die Squeeze-Methode.Warum Segmentierungsfehler: 11 für meinen C-Code aufgetreten?

#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'; 
} 

Wenn ich diesen Code ausführen, Terminal gibt immer Segmentation fault: 11. Könnte mir bitte jemand irgendwelche Hinweise geben, warum das passiert?

+2

bitte reparieren Ihre –

+3

Einrücken Bitte versuchen Sie Debuggen Code! –

+1

Stimmen Sie mit @kiner_shah überein - Sie müssen lernen, wie man einen Debugger benutzt. Das Problem hierbei ist, dass der Wert von "k" über das Ende des "s1" -Arrays hinausgeht. –

Antwort

0

Beispiel:

#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

Problem mit Ihrem Code ist s1[k++] = s1[i];

versuchen, neue Array zu verwenden

siehe Code Nach

#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); 
} 
Verwandte Themen