IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Inversion chaîne en C


Sujet :

C

  1. #1
    Membre habitué Avatar de chercheur111
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 352
    Points : 163
    Points
    163
    Par défaut Inversion chaîne en C
    Bonjour,

    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    #include<stdio.h>
    #include<string.h>
     
    char * inverser(char *  ch)
    {
        int i;
    	int n = strlen(ch); 
    	char lettre; 
        for(i=0;i<n/2;i++)
    	{
    	    lettre = ch[i];
            ch[i] = ch[n-i-1];
            ch[n-i-1] = lettre;
    		printf("%c \n",ch[i]);
        }
        return ch;
    }
    int main()
    {
        char * ch="bonjour";
        printf("la chaine inversee de bonjour est %s\n",inverser(ch));
     
        return 0;
    }
    au moment de l'exécution, j'ai eu le message suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $ ./inverser
    Segmentation fault (core dumped)
    Avez-vous une idée ?
    Merci.
    La science ne connaît qu'une loi: la contribution scientifique.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Il faut
    • Faire attention aux déclarations simple comme char* ch= "bonjour";
    • Vérifier ton paramètre s'il n'est pas NULL
    • Vérifier ton retour s'il n'est pas NULL



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
     
     
    char* inverser(char* ch) {
        if (ch == NULL) { return NULL; }
     
        int i = 0, n = strlen(ch);
        char lettre = '\0';
     
        for(i=0; i < (n / 2); i++) {
            lettre = ch[i];
            ch[i] = ch[n-i-1];
            ch[n-i-1] = lettre;
            printf("%c \n",ch[i]);
        }
     
        return ch;
    }
     
     
    int main() {
        char* ch = (char*) malloc(sizeof(char) * 8);
        memcpy(ch, "bonjour", 8);
        ch[7] = '\0';
     
        printf("la chaine inversee de bonjour est %s\n", inverser(ch));
     
        free(ch);
     
        return 0;
    }

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 34
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par foetus Voir le message
    Il faut
    • Faire attention aux déclarations simple comme char* ch= "bonjour";

    Je plussois allégrement.
    Dans ce genre de déclarations, certains compilateurs (comme celui sur lequel je travaille) met la chaîne "bonjour" directement dans le code objet et fait pointer le pointeur dessus. Cela fait un pointeur qui cible une zone où tu n'as pas le droit d'écrire. D'ailleurs, certains compilateurs et/ou certaines options t'obligent à utiliser const avant le char * pour montrer que tu n'as pas le droit de modifier la zone.
    Avec la solution de foetus, ça doit marcher.

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par olivier_u Voir le message
    Dans ce genre de déclarations, certains compilateurs (comme celui sur lequel je travaille) met la chaîne "bonjour" directement dans le code objet et fait pointer le pointeur dessus. Cela fait un pointeur qui cible une zone où tu n'as pas le droit d'écrire.
    C'est, je pense, le comportement de la plupart des compilateurs.

    Citation Envoyé par olivier_u Voir le message
    D'ailleurs, certains compilateurs et/ou certaines options t'obligent à utiliser const avant le char * pour montrer que tu n'as pas le droit de modifier la zone.
    Avec gcc, il y a un warning pour se prémunir de ce genre de soucis : http://gradot.wordpress.com/2013/05/...trings-de-gcc/

  5. #5
    Membre habitué Avatar de chercheur111
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 352
    Points : 163
    Points
    163
    Par défaut
    Merci bien pour vos réponses.
    La science ne connaît qu'une loi: la contribution scientifique.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    À noter que le malloc() n'est pas nécessaire ici, un petit char ch[]="bonjour"; suffit (déclare un buffer de caractères initilialisé plutôt qu'un pointeur vers une chaîne littérale).

    Et si tu utilises gcc, je plussoie l'usage de -Wwrite-strings.

    PS: On ne caste pas le retour de malloc() en C.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 34
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    À noter que le malloc() n'est pas nécessaire ici, un petit char ch[]="bonjour"; suffit (déclare un buffer de caractères initilialisé plutôt qu'un pointeur vers une chaîne littérale).

    [...]

    PS: On ne caste pas le retour de malloc() en C.
    Moi, on m'a toujours conseillé de le faire.
    Certaines options de compilation vraiment tatillonnes obligent au cast explicite, même depuis void *.
    De toute façon, ça ne mange pas de pain.

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu as éveillé ma curiosité. Quelles options, sur quels compilateurs?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    Citation Envoyé par Médinoc Voir le message
    PS: On ne caste pas le retour de malloc() en C.
    Oui et non, cela dépend de l'appel qu'on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Type * variable = (Type *)malloc( sizeof(Type) );
    Type * variable = malloc( sizeof(*variable) );
    Dans le premier, cas, il vaut mieux caster le retour de malloc pour que le compilateur nous insulte en cas d'erreur.

    A noter que sizeof(char) est inutile vu que par définition, sizeof(char) == 1.

    Pour copier une chaîne de caractère, vous pouvez utiliser strncpy() au lieu de memcpy().

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 34
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Tu as éveillé ma curiosité. Quelles options, sur quels compilateurs?
    Alors là, il faudrait que j'analyse les options utilisées par tous et qu'on recopie un peu bêtement d'un projet sur l'autre . Mais je sais qu'en passant notre code sous MISRA C (pour le faire embarquer), tout transtypage doit être explicite, même pour du void *. Il a fallu qu'on s'amuse à les écrire là où ça n'était pas fait .

  11. #11
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    C'est plutôt l'analyseur MISRA ou les règles MISRA de la chaîne de compilation qui "râlent" plus que le compilateur lui-même ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Inverser une chaîne de caractères
    Par zbooon dans le forum x86 16-bits
    Réponses: 5
    Dernier message: 28/04/2017, 13h44
  2. Inversion d'une chaîne de caractères
    Par camoa dans le forum x86 16-bits
    Réponses: 7
    Dernier message: 31/10/2011, 13h56
  3. Inverser Chaîne de caractères
    Par Spitfire378 dans le forum C
    Réponses: 10
    Dernier message: 02/06/2008, 22h41
  4. Inversion d'une liste chaînée
    Par sossomj dans le forum Pascal
    Réponses: 10
    Dernier message: 25/06/2006, 15h51
  5. Inverser une chaîne de caractères
    Par DBBB dans le forum Assembleur
    Réponses: 2
    Dernier message: 30/03/2003, 11h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo