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 :

Changer un char dans une chaine


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Changer un char dans une chaine
    Salut, je veux changer le 'p' par un 'b' dans la chaine
    char *mot="taple";
    alors j'ai fais *(mot+2)='b' mais ça ne marche pas Vous auriez une ? merci bp, Calaz

  2. #2
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Ca ne marche pas tout simplement parce que tu segfault.

    C'est soit
    soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *mot = malloc(6*sizeof(char));
    sprintf(mot,"taple");
    (ne pas oublier le free qui va bien)
    mais pas
    Tu n'a pas alloué de taille pour stocker tes caractères.

    Bref et au lieu de
    il y a plus simple
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Skyrunner
    mais pas
    Tu n'a pas alloué de taille pour stocker tes caractères.
    Gni ? Quel est le sens de cette pensée profonde ?
    Pas de Wi-Fi à la maison : CPL

  4. #4
    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
    Exact, on ne parle pas ici d'alllouer quoi que ce soit mais de modifier une chaîne existante.

    Par contre, il est possible en effet qu'il y ait une segfault, car la chaîne est peut-être placée dans une section en lecture seule. Mais là, un bon compilateur aurait forcé les constantes chaînes en const si elles sont dans une section read-only...
    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.

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Médinoc
    Exact, on ne parle pas ici d'alllouer quoi que ce soit mais de modifier une chaîne existante.

    Par contre, il est possible en effet qu'il y ait une segfault, car la chaîne est peut-être placée dans une section en lecture seule. Mais là, un bon compilateur aurait forcé les constantes chaînes en const si elles sont dans une section read-only...
    Le compilateur ne va pas modifier le code source... Par contre, et selon ses reglages, il peut detecter qu'un pointeur de type char est initialisé avec l'adresse d'une chaine read-only et signaler l'incohérence.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #line 1
    #include <stdio.h>
     
    int main (void)
    {
       char const *sa = "Hello world";
       char *sb = "Bye";
     
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ../main.c: In function `main_':
    ../main.c:6: warning: initialization discards qualifiers from pointer target type
    ../main.c:5: warning: unused variable `sa'
     
    ../main.c:6: warning: unused variable `sb'
    Pas de Wi-Fi à la maison : CPL

  6. #6
    HRS
    HRS est déconnecté
    Membre confirmé
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    677
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 677
    Points : 638
    Points
    638
    Par défaut
    avec DevC++, le 2nd programme fonctionne alors que le 1er se plante à l'exécution,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <stdio.h>
    int main (void) {
        char *toto = "titi";
        toto[1]='a';
        printf (toto);
        getchar();
        return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <stdio.h>
    int main (void) {
        char toto[]= "titi";
        toto[1]='a';
        printf (toto);
        getchar();
        return 0;
    }
    c'est vrai que cela dépend du compilateur. J'aurais préféré que ce
    dernier, soit provoque une erreur de compile (et non le WARNING indiqué
    par Emmanuel), soit range la donnée dans une mémoire "write"

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par HRS
    J'aurais préféré que ce
    dernier, soit provoque une erreur de compile (et non le WARNING indiqué
    par Emmanuel), soit range la donnée dans une mémoire "write"
    Reprenons ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #line 1
    #include <stdio.h>
    int main (void)
    {
       char *toto = "titi";
       toto[1] = 'a';
       return 0;
    }
    provoque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ../main.c: In function `main_':
     
    ../main.c:4: warning: initialization discards qualifiers from pointer target type
    On met alors son neurone en route et essaye naïvement de corriger comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #line 1
    #include <stdio.h>
    int main (void)
    {
       char const *toto = "titi";
       toto[1] = 'a';
       return 0;
    }
    et là, on voit bien qu'on a fait une anerie...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ../main.c: In function `main_':
     
    ../main.c:5: error: assignment of read-only location
    La bonne correction étant évidemment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <stdio.h>
    int main (void)
    {
       char toto[] = "titi";
       toto[1] = 'a';
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

  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
    Il me semble hélas qu'il faut un flag pour déclarer les constantes chaînes en const (au lieu de le faire automatiquement)...

    Si c'est bien le cas, Emmanuel, tu peux poster tes options de compil?
    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
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Médinoc
    Il me semble hélas qu'il faut un flag pour déclarer les constantes chaînes en const (au lieu de le faire automatiquement)...

    Si c'est bien le cas, Emmanuel, tu peux poster tes options de compil?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    C:\DEV-CPP\BIN>gcc --version
    GCC.EXE (GCC) 3.4.2 (mingw-special)
    Copyright (C) 2004 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    Version 'basique'
    Version 'stricte'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -O2 -Wextra -Wall -ansi -pedantic
    Version 'affinée'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    -O2 -Wchar-subscripts -Wcomment -Wformat=2 -Wimplicit-int -Werror-implicit-function-declaration -Wmain -Wparentheses -Wsequence-point -Wreturn-type -Wswitch -Wtrigraphs -Wunused -Wuninitialized -Wunknown-pragmas  -Wfloat-equal -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wwrite-strings -Wconversion -Wsign-compare -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wmissing-noreturn -Wformat -Wmissing-format-attribute -Wno-deprecated-declarations -Wpacked -Wredundant-decls -Wnested-externs -Winline -Wlong-long
    A tout ça, on peut ajouter mais il va falloir modifier les includes de gcc... Je ne m'y risquerais pas...
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *mot="taple"; 
    alors j'ai fais *(mot+2)='b'
    Medinoc :
    Par contre, il est possible en effet qu'il y ait une segfault...
    . Hélas, certains compilateurs laissent passer et, à l'exécution, on n'a pas forcément d'erreur (apparente). Meme dans ce dernier cas, le programme doit être considéré comme devenu instable et d'un comportement imprévisible.
    Ce code est donc à exclure.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  11. #11
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,
    Citation Envoyé par Skyrunner
    Ca ne marche pas tout simplement parce que tu segfault.
    Pas forcement :
    http://nicolasj.developpez.com/articles/erreurs/#LIX
    http://c.developpez.com/faq/c/?page=...GS_string_init
    Citation Envoyé par Emmanuel Delahaye
    A tout ça, on peut ajouter mais il va falloir modifier les includes de gcc... Je ne m'y risquerais pas...
    C'est un problème lié à Mingw je croi (utilisation du mot clés inline pour la fonction printf qui est une nouveauté du C99), avec cygwin ou sous Linux il n'y a pas de problème.

Discussions similaires

  1. Changer un caractère inclus dans une chaine
    Par AlexFred dans le forum Macro
    Réponses: 2
    Dernier message: 30/10/2013, 16h11
  2. supprimer les espaces dans une chaine de char
    Par poulette3000 dans le forum Linux
    Réponses: 2
    Dernier message: 17/10/2007, 11h45
  3. changer des nombres dans une chaine
    Par newbiegeek dans le forum ASP
    Réponses: 11
    Dernier message: 09/08/2007, 15h24
  4. Réponses: 19
    Dernier message: 30/05/2006, 18h43
  5. [C#] Comment changer dans une chaine
    Par onouiri dans le forum ASP.NET
    Réponses: 7
    Dernier message: 13/05/2004, 13h17

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