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 :

Palindrome sur Linux sans bibliotheque specifique


Sujet :

C

  1. #1
    Membre actif Avatar de 3logy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2007
    Messages : 280
    Points : 222
    Points
    222
    Par défaut Palindrome sur Linux sans bibliotheque specifique
    Salut la Communaute!

    Je suis entrain d'ecrire un programme en C qui doit retourner une sorte de palindrome, je m'explique:
    -Voici un exemple! lorsque j'entre : ANNASUE
    il doit me retourner ANNASUESANNA.
    ca veut dire il prend le tableau initial : ptr = ANNASUE
    le retourne et colle a la suite le palindrome(SUEANNA) mais sans les "UE"; sinon l'on aura ANNASUEEUSANNA;
    ca devrait aussi fonctionner avec tout exemple comme : TENET donne au lieu de "TENETTENET" plutot TENETNET.

    Je programme sur Linux et dans ce programme l'on ne doit point utiliser la bibliotheque <string.h> sinon ce serait trop facile(<-- a dit le prof ):

    voici le code que j'ai ecrit et que j'essaye resourdre en vain depuis quelques jours:
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #define Laenge 100
    int strlen(char *string) 
    {
    	int len=0;
    	while (string[len] != '\0')
    	len ++;
    	return len;
    }
     
    char *move(char *dest, char *quelle)
    {	
    	int i=0,j=0,anzahl;
    	anzahl = strlen(quelle);
    	dest = (char *) malloc(2*anzahl-1);
    	for(i,j;i!='\0',j<anzahl;j++,i++)
    	{
    		dest[j]= quelle[i];
    	}
    	return dest;
    }
     
    char *palindrome(char *ptr)
    {
    	char *ptr2=0;
    	int anzahl,i,j=1;
    	move(ptr2,ptr);
    	anzahl = strlen(ptr);
    	int grenze = 2*anzahl;
    	for (i = anzahl; i != '\0', j < grenze; i--,j++)
    	{
    		ptr2[j+anzahl]= ptr[i-3];
    	}
    	return ptr2;
    }
     
    int main()
    {
    	char *my = 0;
    	char tab[Laenge];
    	printf("Geben sie Ihre String ein : ");
    	scanf("%s",&tab);
    	my = palindrome(tab);
    	printf("Zeichenkette = %s \n", my);	
    	free(my);
    	return 0;
    }
    Merci a tous ceux qui voudront y jeter un coup d'oeil.

    Bon Weekend!

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 52
    Points : 62
    Points
    62
    Par défaut
    Bonjour,

    Ta fonction strlen() est correcte.

    Par contre, la fonction move() qui doit être, vue l'utilisation que tu en fait un semblant de strcpy() comporte plusieurs soucis.

    L'allocation mémoire pour la chaîne de destination ne doit pas être faite à l'intérieur de la fonction mais avant son appel dans la fonction appelante.
    Si tu tiens a conserver le malloc() a l'intérieur de cette fonction, alors il faut soit supprimer le premier paramètre, soit travailler avec un pointeur de pointeur.

    la condition de la boucle for est fausse. I est un entier, la copie doit s'arrêter après la copie du caractère nul de fin de chaîne. Il faut copier le 0 terminal de la chaine pour pouvoir la réutiliser ensuite.
    i et j etant initialisés a 0 et incrémentés en même temps, l'utilisation d'une seule variable suffit. comme anzahl = strlen(quelle); tu t'arrête après la copie du caractère nul. Le code suivant est suffisant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    i=0;
    while(quelle[i])
       {
       dest[i]= quelle[i];
       i++;
       }
    dest[i]=0;
    Dans la fonction palindrome, pour éviter les problèmes de dépassement de tableau, il faudrait tester la longueur de la chaîne reçue en paramètre. Si l'utilisateur saisit un mot de 2 lettres ptr[i-3] risque de ne pas être apprécié par l'OS.
    Ne pas oublier de mettre un caractère nul à la fin de la chaîne générée et de compter ce caractère lors du calcul de la longueur nécessaire.

    Enfin, pour la fonction principale, tu trouveras sur le forum pleins de raisons d'utiliser fgets au lieu de scanf().

    Bonne continuation

  3. #3
    Membre actif Avatar de 3logy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2007
    Messages : 280
    Points : 222
    Points
    222
    Par défaut
    Salut Fred83!

    Bon j'ai supprime la fonction move ! j'ai cru bon de mettre tout dans la Palindrome fonction! donc voici le resultat:
    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
    char *palindrome(char *ptr)
    {
    	char *ptr2=0;
    	int anzahl,i,j;
    	anzahl = strlen(ptr);
    	ptr2 = (char *) malloc(2*anzahl);
    	while(i==0)
    	   {
    	   	ptr2[i]= ptr[i];
    	   	i++;
    	   }
    	for (j=anzahl,i=anzahl;i!='\0'; i--,j++)
    	{
    		ptr2[j+1]= ptr[i-3];
    	}
    	return ptr2;
    }


    mais malheureusement il ne marche pas! Si quelqu'un peut m'eclairer ce serait vraiment super!

    A plus

  4. #4
    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 3logy Voir le message
    Bon j'ai supprime la fonction move ! j'ai cru bon de mettre tout dans la Palindrome fonction! donc voici le resultat:

    mais malheureusement il ne marche pas! Si quelqu'un peut m'eclairer ce serait vraiment super!
    Ca me parait bien compliqué... Il convient de mieux réflechir sur l'algorithme avant de coder une usine à gaz...

    Pour savoir si un mot est un palindrome, on utilise 2 index (ou pointeurs. Un sur la première lettre et un sur la dernière. On compare les lettres pointées deux à deux jusqu'à ce que les pointeurs/index se rencontrent. Dès qu'il y a une différence, ce n'est pas un palindrome.

    (Aucun rapport avec le langage C).
    Pas de Wi-Fi à la maison : CPL

  5. #5
    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
    ....
    while(i==0)
    ....
    i n'a pas été initialisé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
    	for (j=anzahl,i=anzahl;i!='\0'; i--,j++)
    	{
    		ptr2[j+1]= ptr[i-3];
    ....
    i!=0. Pour i = 1 et i = 2 ptr[i-3] va planter.

    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
    char *palindrome(char *ptr)
    {
        char *ptr2=0;
        int anzahl,i,j;
        anzahl = strlen(ptr);
        if(anzahl<3) return NULL; // il n'est pas dit ce qu'on fait dans ce cas
        ptr2 = (char *) malloc(2*(anzahl-2)+2+1);
           // -2 pour ne pas compter les 2 caractères à la fin,
           // +2 pour les caractères du milieu et +1 pour le 0 terminal
        if(ptr2 != NULL) // on doit tester le retour de malloc
        {
           for(i=0; i<anzahl ; i++)ptr2[i]= ptr[i];
           for (j=anzahl-3;j>=0; i++,j--) ptr2[i]= ptr[j];
           ptr2[i] = 0; //A ne pas oublier
        }
        return ptr2; 
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  6. #6
    Membre actif Avatar de 3logy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2007
    Messages : 280
    Points : 222
    Points
    222
    Par défaut Super
    Merci Beaucoup diogene! ca marche
    J'ai modifier la 2eme boucle for comme suit : for (j=anzahl-4;j>=0; i++,j--) ptr2[i]= ptr[j];

    par contre un petit soucis!
    je sais pas si cela a quelque chose a voir avec ma main fonction!

    lorsque j'entre la chaine : ANNASUE il me renvoit:

    ANNASUE
    SANNA

    au lieu de ANNASUESANNA....donc il va a la ligne en quelque sorte....je doute fort que ceci ait un rapport avec ma fonction main, mais neamoins je la poste:

    main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main()
    {
    	char *my = 0;
    	char tab[Laenge];
    	printf("Entrez Votre Palindrome : ");
    	fgets(tab,Laenge,stdin);
    	my = palindrome(tab);
    	printf("Palindrome  = %s ", my);	
    	free(my);
    	return 0;
    }

  7. #7
    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
    fgets(tab,Laenge,stdin);
    Le fgets lit la chaîne et conserve le '\n'. Il faut l'éliminer en le remplaçant par 0. Normalement, si la ligne n'a pas été tronquée, il se trouve à l'indice strlen(...)-1
    C'est d'ailleurs à cause de ce '\n' que tu as du mettre -4 au lieu de -3 dans la boucle for
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  8. #8
    Membre actif Avatar de 3logy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2007
    Messages : 280
    Points : 222
    Points
    222
    Par défaut
    Citation Envoyé par diogene Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fgets(tab,Laenge,stdin);
    Le fgets lit la chaîne et conserve le '\n'. Il faut l'éliminer en le remplaçant par 0. Normalement, si la ligne n'a pas été tronquée, il se trouve à l'indice strlen(...)-1
    C'est d'ailleurs à cause de ce '\n' que tu as du mettre -4 au lieu de -3 dans la boucle for
    ceci dit , je dois faire strlen(ptr)-1? ou comment elimine-t-on le '\n' dans fgets?s'il te plait!

  9. #9
    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
    ce qui nous interresse, c'est la position de '\n' dans tab, donc strlen(tab).
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  10. #10
    Membre actif Avatar de 3logy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2007
    Messages : 280
    Points : 222
    Points
    222
    Par défaut Super!
    Genial Diogene! Merci Beaucoup!

    Derniere question informative!

    Ou est ce que je peux trouver plus d'explication sur le forme main!

    main(int argv,char **argc)? et son utilisation dans le Dos ou sur linux avec les pipes!

  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 diogene Voir le message
    ce qui nous interresse, c'est la position de '\n' dans tab, donc strlen(tab).
    Ca ne fonctionne que si il y a réellement un '\n'. La méthode canonique est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       char *p = strchr(ligne, '\n');
       if (p != NULL)
       {
          *p = 0;
       }
    et si on ne trouve pas, il faut vider le flux. Chercher 'fclean()' sur le forum...
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. [C/C++] Authentifier un user sur Linux, sans PAM
    Par BoloG dans le forum Sécurité
    Réponses: 0
    Dernier message: 11/04/2011, 22h08
  2. Installer alchemy sur windows sans rien connaître à Linux
    Par flasheur dans le forum Flash/Flex
    Réponses: 1
    Dernier message: 05/04/2011, 10h38
  3. bibliotheque pour développement wifi sur linux
    Par nightwar dans le forum Réseau
    Réponses: 0
    Dernier message: 27/10/2009, 17h17
  4. Réponses: 3
    Dernier message: 06/04/2007, 15h34
  5. [analyse de syntaxe] pour C et C++ sur Linux
    Par Madmac dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 10/07/2004, 06h37

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