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 :

Recopier une chaine, caractère par caractère


Sujet :

C

  1. #1
    Membre éclairé
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Par défaut Recopier une chaine, caractère par caractère
    Bonjour,

    La méthode reçoit un pointeur sur un caractère. Elle doit renvoyer la chaîne reçu en ayant remplacé chaque apostrophe ' par deux apostrophes ''.

    Malheureusement après quelques testes, il semblerait que ma méthode ne fonctionne 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
    char * traiterApostrophe(char * chaine)
    {
    	char resultat[NBR_LIGNE];
    	char * resultatReturn;
    	resultatReturn = resultat;
     
    	int car, seek = 0, taille = strlen(chaine);
     
    	for (car = 0; car < taille; car++)
    	{
    		resultat[seek] = chaine[car];
    		seek = seek + 1;
     
    		if (chaine[car] == '\'')
    		{
    			resultat[seek] = '\'';
    			seek = seek + 1;
    		}
    	}
     
    	return resultatReturn;
    }
    Quelles sont les modifications à y apporter pour que chaque apostrophe de la chaîne d'entrée soit écrit deux fois ? Par exemple : l'avion => l''avion.

    D'avance merci pour vos réponses.



    xenos

  2. #2
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Tu dis vouloir retourner la chaîne passée en argument, mais ce n'est pas ce que tu fais :
    retourner l'adresse d'une variable locale est bien sûr incorrect.
    règles déjà ça pour le moment et tu y verras plus clair

  3. #3
    Membre éclairé
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Par défaut
    Citation Envoyé par ssmario2 Voir le message
    Tu dis vouloir retourner la chaîne passée en argument, mais ce n'est pas ce que tu fais :
    retourner l'adresse d'une variable locale est bien sûr incorrect.
    règles déjà ça pour le moment et tu y verras plus clair
    Oui, je dis renvoyer la chaine passée en paramètre. Mais la renvoyée modifiée. Donc je copie caractère dans une variable temporaire et lorsque je vois un ' j'écris à la place ''.

    Je renvoie alors la nouvelle version de la chaîne passée en paramètre.

    Citation Envoyé par xenos Voir le message
    Par exemple : l'avion => l''avion.

  4. #4
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Citation Envoyé par xenos Voir le message
    Oui, je dis renvoyer la chaine passée en paramètre. Mais la renvoyée modifiée. Donc je copie caractère dans une variable temporaire et lorsque je vois un ' j'écris à la place ''.

    Je renvoie alors la nouvelle version de la chaîne passée en paramètre.
    Oui mais en meme temps ta variable resultatReturn, tu ne l'utilises pas dans ta fct. Elle ne sert à rien. A mon avis, tu voulais faire


  5. #5
    Membre éclairé
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Par défaut
    J'ai supprimé resultatReturn. Ca fonctionne, mais lors de la compilation il me dit :
    Attention : Cette fonction retourne l'adresse d'une variable locale.
    Maintenant que dois je faire pour remplacer les ' par '' ?

    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
    char * traiterApostrophe(char * chaine)
    {
    	char resultat[NBR_LIGNE];
     
    	int car, seek = 0, taille = strlen(chaine);
     
    	for (car = 0; car < taille; car++)
    	{
    		resultat[seek] = chaine[car];
    		seek = seek + 1;
     
    		if (chaine[car] == '\'')
    		{
    			resultat[seek] = '\'';
    			seek = seek + 1;
    		}
    	}
     
    	return resultat;
    }

  6. #6
    Invité
    Invité(e)
    Par défaut
    Attention : Cette fonction retourne l'adresse d'une variable locale.
    Ce warning n'est pas à négliger : tu déclares résultat dans ta fonction. Cela veut dire que c'est une variable locale, et qu'à la fin de la fonction elle n'existe plus. Donc quand tu récupèreras son adresse au niveau du code appelant, il y aura de la daube dedans.

    En général pour faire un truc clean, on alloue la chaîne de retour dans l'appelant, et on passe en paramètre de la fonction les chaînes d'entrée et de sortie, avec leurs tailles respectives. Comme ça tu peux utiliser la valeur de retour pour autre chose, comme récupérer un code d'erreur, ou dans ton cas le nombre de guillemets remplacés.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int traiteApostrophe(char *szIn, int iTailleIn, char *szOut, int *iTailleOut);
    iTailleOut n'est pas forcément nécessaire si la chaîne de sortie a la même taille que la chaîne d'entrée.

  7. #7
    Membre confirmé
    Homme Profil pro
    Software engineer
    Inscrit en
    Août 2008
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Software engineer

    Informations forums :
    Inscription : Août 2008
    Messages : 139
    Par défaut
    je crois ca peut etre la meilleure solution :
    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
     
    char * traiterApostrophe(char * chaine)
    {
    	char *resultat=malloc(sizeof(char)*NBR_LIGNE);
     
    	int car, seek = 0, taille = strlen(chaine);
     
    	for (car = 0; car < taille; car++)
    	{
    		resultat[seek] = chaine[car];
    		seek = seek + 1;
     
    		if (chaine[car] == '\'')
    		{
    			resultat[seek] = '\'';
    			seek = seek + 1;
    		}
    	}
     
    	return resultat;
    }

  8. #8
    Membre éclairé
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Par défaut
    Merci pour ton code oswalidos. Mais en le testant, il me rajoute des caractères à la fin. Des ? ... :s

  9. #9
    Membre éclairé
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Par défaut
    J'ai rajouté une dernière ligne. Qu'il rajoute après avoir copié les caractères un dernier caractère \0 :

    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
    char * traiterApostrophe(char * chaine)
    {
    	char * resultat = malloc(sizeof(char) * NBR_LIGNE);
     
    	int car, seek = 0, taille = strlen(chaine);
     
    	for (car = 0; car < taille; car++)
    	{
    		printf("%c\n", chaine[car]);
    		resultat[seek] = chaine[car];
    		seek = seek + 1;
     
    		if (chaine[car] == '\'')
    		{
    			resultat[seek] = '\'';
    			seek = seek + 1;
    		}
    	}
     
    	resultat[seek] = '\0';
     
    	return resultat;
    }
    À première vue ça à l'air de fonctionner, je fais encore quelques tests.

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/07/2007, 15h17
  2. Réponses: 1
    Dernier message: 22/01/2007, 20h33
  3. pb concaténation d'une chaine avec un caractère
    Par P'tite Nélodie dans le forum C
    Réponses: 9
    Dernier message: 06/11/2006, 19h09
  4. Vérifier si une chaine contient des caractères spéciaux
    Par BenoitDenis dans le forum Langage
    Réponses: 4
    Dernier message: 05/07/2006, 16h26
  5. Réponses: 6
    Dernier message: 15/05/2006, 22h39

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