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 :

Inverser Chaîne de caractères


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 40
    Points : 28
    Points
    28
    Par défaut Inverser Chaîne de caractères
    Bonjour je cherche a inverser une chaine de caracteres mais mon code ne marche pas pouvez vous m'aider :

    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
    #include <stdio.h>
    #include <string.h>
     
    void reverse(char *chaine1, char *chaine2);
     
    int main (int argc, const char * argv[]) {
    	char chaine1[100];
    	char chaine2[100];
    	printf("Entrez une chaine de caracteres : ");
    	fgets(chaine1, sizeof chaine1, stdin);
    	printf("Vous avez entré : %s", chaine1);
     
    	reverse(chaine1, chaine2);
        return 0;
    }
     
    void reverse(char *chaine1, char *chaine2)
    {
    	int i;
    	int j = 0;
    	i = strlen(chaine1);
     
    	for (i-1; i=0; i--)
    	{
    		chaine2[j] = chaine1[i];
    		j++;
    	}
    	printf("%s", *chaine2);
    }
    Merci d'avance

  2. #2
    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
    3
    4
    5
    6
    7
    	for (i-1; i>=0; i--)
    	{
    		chaine2[j] = chaine1[i];
    		j++;
    	}
            chaine2[j] = '\0';
    	printf("%s", chaine2); // pas d'*

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Merci Beaucoup

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Dans le même genre je dois modifier dans une chaine les lettres par la suivante, par ex on remplace a par b, mais voila mon code et ca ne marche pas

    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
    #include <stdio.h>
    #include <string.h>
     
    void modifchaine(char *chaine1, char *chaine2);
     
    int main (int argc, const char * argv[]) {
    	char chaine1[100];
    	char chaine2[100];
    	printf("Entrez une chaine de caracteres : ");
    	fgets(chaine1, sizeof chaine1, stdin);
    	printf("Vous avez entré : %s", chaine1);
     
    	modifchaine(chaine1, chaine2);
     
        return 0;
    }
     
    void modifchaine(char *chaine1, char *chaine2)
    {
     
    	while(*chaine1)
    	{
    		if (isalpha(*chaine1))
    		{
    			*chaine1 = *chaine2++;
    		}
    		chaine1++;
    	}
    	printf("%s", *chaine2);
    }

  5. #5
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Et je rajouterais :
    Citation Envoyé par diogene Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	for (i=i-1; i>=0; i--)
    	{
    		chaine2[j] = chaine1[i];
    		j++;
    	}
            chaine2[j] = '\0';
    	printf("%s", chaine2); // pas d'*

  6. #6
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    *chaine2 = *chaine1++;
    chaine2++ ;
    et ton print doit être dans la fonction appelante

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Excuse moi souviron mais je ne comprends pas vraiment

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Ce qu'il veut dire, c'est que les fonctions que tu as créé pour modifier les chaînes ne devraient rien afficher. Si tu veux afficher les chaînes, il vaut mieux le faire depuis la fonction 'main', après l'appel de la fonction.

    Dans le meme genre je dois modifier dans une chaine les lettres par la sauivante, par ex on remplace a par b, mais voila mon code et ca ne marche pas
    Dans ton code, tu copies simplement une chaîne dans une autre.

    Il faut donc écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            if (isalpha(*chaine1))
            {
                if (++(*chaine2 = *chaine1)>'z') *chaine2='a';
            } else *chaine2= *chaine1;
            chaine1++;
            chaine2++;
    (Attention, ça ne marche que pour les minuscules. Pour gérer majuscules et minuscules à la fois, il faut coder autrement.)

    Quelques explications :
    *chaine2 = *chaine1++; copie le caractère pointé par 'chaine1' dans le caractère pointé par 'chaine2', puis incrémente ensuite le pointeur 'chaine1'.
    ++(*chaine2 = *chaine1); copie le caractère pointé par 'chaine1' dans le caractère pointé par 'chaine2', et l'incrémente. Cela permet donc de remplacer la valeur 'a' par 'b', 'b' par 'c', etc. On pourrait mettre le '++' à la fin s'il n'y avait pas le test de la condition du 'if'. Car si on dépasse 'z', il faut revenir à 'a'. Avec le '++' avant, l'incrémentation se fait avant le test de la condition; ça permet de tester si le caractère est supérieur à 'z'. Si on met le '++' à la fin, cela va foirer le test de la condition au cas où on incrémente le caractère 'z'.

    D'où le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (++(*chaine2 = *chaine1)>'z') *chaine2='a';

  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 Spitfire378 Voir le message
    Bonjour je cherche a inverser une chaine de caracteres mais mon code ne marche pas pouvez vous m'aider :
    Tu peux déjà corriger ça :
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : D:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:6: warning: unused parameter 'argc'
    main.c:6: warning: unused parameter 'argv'
    main.c: In function `reverse':
    main.c:23: warning: suggest parentheses around assignment used as truth value
    main.c:28: warning: format argument is not a pointer (arg 2)
    main.c:23: warning: statement with no effect
    main.c:25: warning: will never be executed
    main.c:25: warning: will never be executed
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 1 seconds)
    0 errors, 7 warnings
    Ton code est beaucoup trop complexe. Comme toujours, il suffit de réfléchir 2 minutes avant d'agir...

    Il suffit d'un indice :

    source : 1 -> n-1
    destination : n-1 -> 0

    Ne pas oublier le 0 final.

    Attention aussi au nommage des variables et aux conventions :

    f (destination, source)
    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
     
    #include <stdio.h>
    #include <string.h>
     
    void reverse (char *s_new, char const *s_old)
    {
       int i;
       int n = strlen (s_old);
     
       for (i = 0; i < n; i++)
       {
          s_new[n - i - 1] = s_old[i];
       }
       s_new[n] = 0;
    }
     
    int main (void)
    {
       char const chaine1[] = "Hello world";
       char chaine2[100];
     
       reverse (chaine2, chaine1);
       printf ("chaine1 = '%s'\n", chaine1);
       printf ("chaine2 = '%s'\n", chaine2);
       return 0;
    }

  10. #10
    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 Spitfire378 Voir le message
    Dans le même genre je dois modifier dans une chaine les lettres par la suivante, par ex on remplace a par b, mais voila mon code et ca ne marche pas

    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
    #include <stdio.h>
    #include <string.h>
     
    void modifchaine(char *chaine1, char *chaine2);
     
    int main (int argc, const char * argv[]) {
    	char chaine1[100];
    	char chaine2[100];
    	printf("Entrez une chaine de caracteres : ");
    	fgets(chaine1, sizeof chaine1, stdin);
    	printf("Vous avez entré : %s", chaine1);
     
    	modifchaine(chaine1, chaine2);
     
        return 0;
    }
     
    void modifchaine(char *chaine1, char *chaine2)
    {
     
    	while(*chaine1)
    	{
    		if (isalpha(*chaine1))
    		{
    			*chaine1 = *chaine2++;
    		}
    		chaine1++;
    	}
    	printf("%s", *chaine2);
    }
    Là encore, il faut un peu réfléchir :
    • parcourir la chaine
    • filtrer les caractères alpha
    • séparer en minuscules et majuscules
    • selon l'alphabet (min, maj), chercher la position de la lettre, ajouter 1 modulo 26 pour ne pas déborder.
    • Récupérer la nouvelle lettre, la copier, ne pas oublier le 0 final...

    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
     
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
     
    int get_next (char const alpha[], int c)
    {
       int c_out = c;
       char *p = strchr (alpha, c);
       if (p != NULL)
       {
          ptrdiff_t i = (p - alpha + 1) % 26;
          c_out = alpha[i];
       }
       return c_out;
    }
     
    void modifchaine (char *s_new, char const *s_old)
    {
       int i;
       int n = strlen (s_old);
       for (i = 0; i < n; i++)
       {
          unsigned c = s_old[i];
          if (isalpha (c))
          {
             if (isupper (c))
             {
                c = get_next ("ABCDEFGHIJKLMNOPQRSTUVWXYZ", c);
             }
             else
             {
                c = get_next ("abcdefghijklmnopqrstuvwxyz", c);
             }
          }
          s_new[i] = c;
       }
       s_new[i] = 0;
     
    }
     
    int main (void)
    {
       char const chaine1[] = "Hello worldz";
       char chaine2[100];
     
       modifchaine (chaine2, chaine1);
       printf ("chaine1 = '%s'\n", chaine1);
       printf ("chaine2 = '%s'\n", chaine2);
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    chaine1 = 'Hello worldz'
    chaine2 = 'Ifmmp xpsmea'
     
    Press ENTER to continue.

  11. #11
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par jeroman Voir le message
    Il faut donc écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            if (isalpha(*chaine1))
            {
                if (++(*chaine2 = *chaine1)>'z') *chaine2='a';
            } else *chaine2= *chaine1;
            chaine1++;
            chaine2++;
    Je me permettrais juste deux petites remarques :
    * Ce n'est pas super lisible. Séparer un peu plus les traitements (en particulier le if) permettrait d'être plus clair.
    * Tu supposes que les lettres sont contiguës et ordonnées dans le charset utilisé, ce qui n'est pas garanti (cette propriété est vérifiée pour l'ASCII pas pour l'EBCIC).

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 une chaîne de caractères
    Par Nyko17 dans le forum x86 16-bits
    Réponses: 1
    Dernier message: 10/05/2008, 19h45
  4. Réponses: 3
    Dernier message: 24/10/2007, 01h47
  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