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 :

Retirer le premier caractère d'une chaine de caractères


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Retirer le premier caractère d'une chaine de caractères
    Bonjour,
    Alors mon problème va sûrement vous paraître trivial mais je souhaite créer une fonction qui retire le premier caractère d'une chaine de caractères. J'ai créer les fonctions suivantes :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    int taille_chaine (char * chaine)
    {
    int taille = 0;
    char caract = 0;
     
    do
    {
    caract = chaine[taille];
    taille++;
    }
    while(caract != '\0'); // On boucle tant qu'on n'est pas arrivé à l'\0
     
    taille--; // On retire 1 caractère de long pour ne pas compter l'\0
     
    return taille;
    }
     
    /*******************************************************/
     
    char * reste_mot (char * chaine)
    { 
    char * new_chaine;
    int i, j;
    int n;
     
    n = taille_chaine(chaine);
    printf("nombre de caracteres dans word : %d \n",n);
    new_chaine = (char*) malloc (n*sizeof(char));
    system("pause");
     
     
    for (i=0;i<n;i++)
    { for (j=1;j<n+1;j++)
    { new_chaine[i] = chaine[j];
    }
    }
    printf ("Maintenant votre mot est : %s \n",new_chaine);
    return new_chaine;
     
    }
     
    Voici mon main :
     
    int main(int argc, char *argv[])
    {
    char * reste;
    reste = reste_mot("bonjour");
     
    free(reste); 
     
     
    system("PAUSE");    
    return 0;
    }
    Le problème est que lorsque j'affiche new_chaine, je n'ai rien d'afficher. Alors je vous remercie à l'avance pour toutes les solutions que vous pourrez m'apporter.
    Merci
    Mygirl

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Je te laisse chercher, l'erreur est là
    for (i=0;i<n;i++)
    { for (j=1;j<n+1;j++)
    { new_chaine[i] = chaine[j];
    }
    }
    Tu peux également relire les règles du forum, et notamment la partie présentation du code.

  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 Mygirl
    Bonjour,
    Alors mon problème va sûrement vous paraître trivial mais je souhaite créer une fonction qui retire le premier caractère d'une chaine de caractères. J'ai créer les fonctions suivantes :
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums2\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `reste_mot':
    main.c:27: warning: implicit declaration of function `printf'
    main.c:28: warning: implicit declaration of function `malloc'
    main.c:29: warning: implicit declaration of function `system'
    main.c: In function `main':
    main.c:45: warning: passing arg 1 of `reste_mot' discards qualifiers from pointer target type
    main.c:47: warning: implicit declaration of function `free'
    main.c: At top level:
    main.c:42: warning: unused parameter 'argc'
    main.c:42: warning: unused parameter 'argv'
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 4 seconds)
    0 errors, 7 warnings
    Supair...
    • Manque les headers
    • Les paramètres de main() ne sont pas utilisés
    • Le nom de la fonction est abscons.
    • La fonction devrait accepter les chaine non modifiables. ajouter const : char *reste_mot (char const *chaine)
    • Pour 'taille_chaine()' tu peux utiliser strlen()
    • Revoir l'algorithme de copie. Il n'y a aucune raison d'avoir 2 boucles imbriquées. Manque le 0 final... Pourquoi réinventer la roue ? strcpy() convient. Il suffit de démarrer au bon endroit...
    • new_chaine = (char *) malloc (n * sizeof (char)); Mieux vaut écrire du code simple et sûr que du code inutilement compliqué...
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
         char *new_chaine = malloc (n); /* +1 -1 */
         if (new_chaine != NULL)
         {

    Je propose ceci :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    char *str_supp_first (char const *chaine)
    {
       char *new_chaine = NULL;
       if (chaine != NULL)
       {
          size_t const n = strlen (chaine);
     
          new_chaine = malloc (n);
          if (new_chaine != NULL)
          {
             strcpy (new_chaine, chaine + 1);
          }
       }
       return new_chaine;
    }
     
    int main (void)
    {
       char *reste = str_supp_first ("bonjour");
       if (reste != NULL)
       {
          printf ("Maintenant votre mot est : '%s' \n", reste);
          free (reste), reste = NULL;
       }
     
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Maintenant votre mot est : 'onjour'
     
    Press ENTER to continue.
    Pose des questions si tu ne comprends pas.

  4. #4
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Quand vous copiez des chaînes, il vous faut aussi copier le '\0' à la fin. En outre, il ne faut pas utiliser deux boucles mais une seule:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    new_chaine = (char*) malloc ((n+1)*sizeof(char)); /*+1 pour le \0 à la fin*/
    ...
    for (j=0;j<n+1;j++)
     new_chaine[j] = chaine[j];

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Ah oui, je pense que ceci serait préférable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for (i=0;i<n;i++)
    { new_chaine[i] = chaine[i+1];
    }
    En tout cas merci beaucoup pour la réponse, et désolée pour le code trop long.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    strcpy() convient. Il suffit de démarrer au bon endroit...
    Bonjour, pourrais-tu donner plus de précisions sur le strcpy ? Est-il possible de commencer à copier par exemple à partir du 4e caractère ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    		i=3; // On initialise à 4-1 pour l'incrémentation i++
    		do
    		{
    			i++;
    			msg[i-4]=buffer2[i];
    		}while(buffer2[i]!='\0');
    Je fais cela pour l'instant mais c'est pas super optimisé (y a un while en plus)

    Merci d'avance

  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 Mygirl
    Ah oui, je pense que ceci serait préférable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      for (i=0;i<n;i++)
        { new_chaine[i] = chaine[i+1];
        }
    Nettement mieux. Attention au 0 final...

  8. #8
    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 Stupeflip
    Bonjour, pourrais-tu donner plus de précisions sur le strcpy ? Est-il possible de commencer à copier par exemple à partir du 4e caractère ?
    J'ai donné un exemple.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    Merci beaucoup

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    il y a encore plus rapide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    memcpy ( new_chaine, &(chaine[1]), (size_t)(strlen(chaine)-1) );
    newchaine[strlen(chaine)-1] = '\0' ;

  11. #11
    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 souviron34
    il y a encore plus rapide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    memcpy ( new_chaine, &(chaine[1]), (size_t)(strlen(chaine)-1) );
    newchaine[strlen(chaine)-1] = '\0' ;
    Plus rapide avec 2 strlen() ? J'avoue ne pas comprendre où tu veux en venir. Que peut-il y avoir de plus simple et de plus rapide que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy (new_chaine, chaine + 1);
    déjà cité ?

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/10/2008, 17h05
  2. Réponses: 2
    Dernier message: 25/04/2008, 12h48
  3. Réponses: 2
    Dernier message: 19/06/2007, 16h37
  4. Supprimer le premier caractère d'une chaine de caractères
    Par Droïde Système7 dans le forum Langage
    Réponses: 2
    Dernier message: 30/09/2005, 11h13
  5. [langage] Retirer le premier caractère d'une chaine ?
    Par kwisach dans le forum Langage
    Réponses: 5
    Dernier message: 24/04/2003, 11h05

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