2010-09-17 7 views
2

C'est une question pour les débutants: pourquoi cette rupture/donner une erreur?Pourquoi ce programme donne-t-il un défaut de segmentation?

#include <stdio.h>  
#include <stdlib.h> 
#include <string.h> 

char *strtrim_right(char *p) 
{ 
    char *end; 
    int len; 
    len = strlen(p); 
    while (*p && len) 
    { 
    end = p + len-1; 
    if(isalpha(*end)) 
    *end =0; 
    else 
    break;  
    } 
    return(p); 
} 


int main() 
{ 
    char *x="PM123BFD"; 
    strtrim_right(x); 
    printf("%s", x); 
    return 0; 
} 
+2

Quelle est l'erreur? Quelle ligne? Quel compilateur? Quelle plateforme? Comment vous attendez-vous que nous vous aidions si vous ne fournissez pas d'informations? –

+1

@Alexandre Segfault – NullUserException

+1

"Conversion obsolète de la chaîne de caractères en 'char *'" pour x; utilisez plutôt un tableau char: char x [] = ... – slashmais

Répondre

11

changement

char *x="PM123BFD"; 

à

char x[]="PM123BFD"; 

Vous ne pouvez pas modifier une chaîne littérale, donc passer plutôt la fonction d'un tableau char qui peut modifier.

5

Je ne vois pas pourquoi il devrait casser - je préférerais attendre à une boucle infinie: la condition while sera toujours vrai et la boucle ne sera jamais quitté.

Retravailler l'état de la boucle, c'est bouché. Ensuite, regardez les variables que vous avez: vous ne changez jamais les valeurs de p ou len. Ce n'est pas correct. De plus, le code à l'intérieur de la boucle est beaucoup plus compliqué que nécessaire. Pensez à si vous avez vraiment besoin de trois variables ici.

0

Ok merci aux 2 réponses ci-dessus ici est ce qui semble être ok maintenant:

#include <stdio.h>  
#include <stdlib.h> 
#include <string.h> 

char *strtrim_right(char *p) 
{ 
    char *end; 
    int len; 
    len = strlen(p); 
    while (*p && len) 
    { 
    end = p + len-1; 
    if(isalpha(*end)) 
    *end =0; 
    else 
    break; 
len = strlen(p); 
    } 
    return(p); 
} 


int main() 
{ 
    char x[]="PM123BFD"; 
    strtrim_right(x); 
    printf("%s", x); 
    return 0; 
} 
+1

Pourquoi strtrim_right retourne un pointeur char si vous ne l'utilisez pas? – jmtd

+1

il y a encore beaucoup de problèmes avec ce code. La condition 'while' et le code à l'intérieur de la boucle sont désespérément compliqués. –

+0

@jmtd: à droite, ce retour devrait être supprimé. – francogrex

Questions connexes