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 :

[DEBUTANT] Copie de variable avec ou sans CR


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 91
    Par défaut [DEBUTANT] Copie de variable avec ou sans CR
    Bonjour,

    j'ai un problème de débutant et je m'en remets à vous

    J'ai une fonction qui a pour but de retirer tous les retour chariot '\r' afin d'avoir une chaîne de caractère sur une seule ligne (je l'envoie par la suite en requête HTTP d'où mon besoin de ne pas avoir de '\r' dedans).

    la fonction est la suivante :

    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 * format_paramCR(char * param)
    {
    	int i=0;
    	int lg=strlen(param);
    	char * temp=(char *)calloc(lg, sizeof(char));
    	for (i=0;i<lg;i++)
    	{
    		if (param[i]=='\r')
    		{
    			temp[i]='z';
    		}
                             else
                            {
                               temp[i]=param[i];
                            }
    	}
     
    	return temp;
    }
    Le code semble fonctionner car quand je demande l'affichage de temp, ceci est correct. Mon problème vient de la récupération de "temp".

    J'ai une variable "Desc" qui contient :
    "salut
    bonjour"

    je voudrais donc obtenir : "salutbonjour" par exemple.
    Quand je fais : "Desc = format_paramCR(Desc)" ca plante. Je peux le faire avec n'importe quel autre caractère à remplacer mais ça plante avec le CR.
    Vous pouvez m'expliquer? Y a t il une solution pour que je puisse récupérer ma variable modifiée?
    J'ai regardé la longueur de "temp" et de "Desc" est la même de même que la mémoire allouée pour les deux variables.
    Merci

    NB : j'essaye de remplacer \r par 'z' pour le moment afin de voir si cela fonctionne.

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salut,

    La norme HTTP dit que les sauts de ligne sont CRLF (\r\n), mais en fait les serveurs acceptent aussi LF (\n) comme saut de ligne (edit : ça c'était completement HS)
    Pour recapituler :
    * LF : sauts de ligne unix
    * CRLF : sauts de ligne dos et souvent protocoles web
    * CR : sauts de ligne mac

  3. #3
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Pour ta question tu alloues pas assez de place pour la chaine de sortie ( :p )

  4. #4
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    bon, si j'ai bien suivi ton algo, j'ai une chaine "bonjour\rça va ?" je la passe par ta fonction et voila ce qui se passe :

    tu alloues temp avec un calloc (chaque case remplie avec un \0) de la taille de ta chaine (pense a ajouter +1 pour le \0 final qui n'est pas compté par strlen)

    ensuite, tu remplis ta chaine temp avec des 'z' (??) a chaque fois que tu trouves un '\r'

    donc en sortie de boucle, temp vaut {0,0,0,0,0,0,0,'z',0,0,0,0,0,0,0} et c'est ça que tu renvoies.

    je suis pas sur d'avoir compris ou tu voulais en venir donc.

    donc au final, quand tu traites la chaine, vu que le premier caractère c'est 0, c'est considéré comme une chaine vide.


    EDIT : ah, j'avais pas vu le else, ou tu l as ajouté entre temps.

    Quoi qu'il en soit, ajouter un 'z' a la place de ton \r, je sais pas si c'est la meilleure solution

  5. #5
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Citation Envoyé par Faiche
    Quoi qu'il en soit, ajouter un 'z' a la place de ton \r, je sais pas si c'est la meilleure solution
    Il le fait pour débugger. Mais t'as raison, quitte à mettre quelque chose à la place, autant mettre un espace...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 91
    Par défaut
    Tout d'abord merci de répondre aussi vite.

    Pour le "else" oui je me suis aperçu entre temps que je l'avais oublié.

    Je vais essayer d'être plus clair sur l'ensemble de mon problème.

    Le programme C sur lequel je bute est en fait une DLL. Cette même Dll est appelé par un programme Java. Ma variable "Desc" est passée en paramètre depuis mon programme Java.

    On la récupère donc en jstring.
    Je fais ensuite une conversion pour pouvoir l'exploiter en langage C.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    const char *Desc = env->GetStringUTFChars( jDesc, 0);
    Je n'ai donc pas "alloué" de mémoire à ma variable Desc depuis mon programme C. Comment faire pour la modifier et lui permettre d'avoir plus de place?

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    ce n'est pas là qu'il te faut plus de place, c'est dans temp.
    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.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 91
    Par défaut
    Je ne sais pas trop... Quand je modifie l'allocation mémoire de "temp" cela ne change rien. De plus, si je laisse l'allocation comme elle est et que je demande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    format_paramCR(Description);
    il ne plante pas. C'est à partir du moment où je demande "Description = format_paramCR(Description)" qu'il y a un problème.

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    (post croisé)
    Donc, tu dois d'abord allouer un buffer au moins aussi grand que Desc, caractère nul compris (taille minimale : strlen(Desc)+1).

    Ensuite, si tu veux juste remplacer des caractères sans changer la longueur de la chaîne, ça va tout seul.
    Si tu veux supprimer des caractères sans les remplacer, tu peux regarder ici.
    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.

Discussions similaires

  1. Comparer variables avec extraction sans recherche
    Par Toine45 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 20/01/2008, 21h02
  2. Réponses: 10
    Dernier message: 29/10/2007, 14h15
  3. fonction avec et sans variable
    Par Emcy dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 02/02/2007, 10h03
  4. Réponses: 1
    Dernier message: 15/05/2006, 18h05
  5. Réponses: 9
    Dernier message: 22/07/2005, 16h10

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