[C] comment on fé une fonction ki renvoie une chaine de caracteres ?

comment on fé une fonction ki renvoie une chaine de caracteres ? [C] - C++ - Programmation

Marsh Posté le 26-04-2002 à 17:16:20    

j'aimerais faire une fonction ki reçoit en entrée une chaine de caractere et ki renvoi la meme modifiée
c koi la syntaxe ?
 
char transforme (char mot[MAX])
 {
 
 return * mot;
 }
 
main()
 {
 char mot[6];
 
 mot = transforme (mot)
 }
 
ca marche mé il me demande une LVALUE ke j'arriv pa à lui fournir, donc j'aimerais bien avoir la syntaxe de la déclaration de la fonction et de son appel
 
merci

Reply

Marsh Posté le 26-04-2002 à 17:16:20   

Reply

Marsh Posté le 26-04-2002 à 17:30:41    

char *transforme(char *mot)
{
   return mot;
}
Le résultat de la fonction est le pointeur sur mot.
 
char *transforme(char *mot)
{
  char *res;
  res = NULL;
  if (mot) {
    res = (char *)malloc(strlen(mot));
    strcpy(res,mot);  
  }
  return res;
}
 
Le résultat est un pointeur sur une nouvelle chaîne qui est la copie de mot, ou nil si mot necontient rien.

 

[jfdsdjhfuetppo]--Message édité par zi_ril_wanou le 26-04-2002 à 17:31:09--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 26-04-2002 à 17:36:35    

char mot[6];
 
=> mot est un char * (adresse du premier caractere d'un tableau de 6 caracteres)
 
char transforme()
 
ta fonction renvoit un char ... et tu stockes ca dans un char * ... donc ca coince ...
 
il suffit donc de modifier ta fonction en :
 
char * transforme (char mot[MAX])  
 
 
Au passage, vaut mieux faire carement :
 
char transforme (char * mot)  
 
car rien ne t'empeche de passer une chaine plus petite ou plus longue ...
pour connaitre la taille de celle-ci, il faut controler chaque caractere ... le dernier vaut 0 ('\0';);
et ta fonction est aussi reutilisable plus facilement ... (avec d'autres chaines d'autre taille)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 26-04-2002 à 17:40:26    

la fonction compile mé ya tjs ce probleme de Lvalue si je fé :
 
mot = transforme (mot);
 
fo pa un * ou un & kekpart ?

Reply

Marsh Posté le 26-04-2002 à 17:46:54    

si mot est un char * et transforme() retourne un char* y doit pas y avoir de pb..

 

[jfdsdjhfuetppo]--Message édité par *Syl* le 26-04-2002 à 17:48:15--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 26-04-2002 à 17:57:57    

bon, voilà la fonction :
 
char * transforme (char * heure)
 {
 int i;
 
 if (heure[1] == ':';)
  {
  for (i=6;i>0;i--)
   heure[i] = heure[i-1];
  heure[i] = '0';
  }
 
 return heure;
 }
 
en bref c une fonction ki modifie une heure dans le cas où ya pas de 0 en premier (ex: 1:32 -> 01:32)
 
puis dans le main :
main()
 {
 char heure[5+1];
 
 scanf ("%s",&heure);
 
 heure = transforme (heure);
 }
 
et il me met une erreur : Lvalue required avec le curseur juste derriere le =

Reply

Marsh Posté le 26-04-2002 à 18:00:17    

Euh, en fait j'ai repondu trop vite ;)
pas besoin du char * dans ton cas ... la chaine passee en parametre est directement modifiee ... pas besoin de retourner quoi que ce soit
de plus, mot = transforme (mot) est tres mauvais .. :)
 
et ca doit aussi etre la cause de ton erreur lvalue
mot est un tableau, pas une variable que tu peux librement re-affecter
2 raisons : en la reaffectant, tu perds la memoire qu'utilsait tableau avant (les 6 caracteres) et tu ne peux plus les utiliser
            surtout, c'est un nombre ! une adresse definie par le compilateur, donc, un nombre
c'est comme si tu ecrivait :
 
10 = transforme (mot);
 
d'ou l'erreur left-value requise (lvalue required)
il a besoin d'une variable a gauche, or tu lui fournis un nombre
plus d'infos sur ca et plein d'autres pieges :
http://www.isty-info.uvsq.fr/~rume [...] .html#q_10
 
Desole pour zi_ril_wanou, mais je ne suis pas d'accord avec sa reponse
 
rien en effet ne garantit que la memoire qu'il alloue avec le malloc sera desallouee ...
 
un source tel que :

Code :
  1. main()
  2. {
  3.     char * mot = "test";
  4.     while(/* une condition*/)  mot = transforme(mot);
  5. }


 
aurait vite fait de satturer la memoire
une fonction doit effectuer un travail et c'est tout, et pas laisser une pertie du travail a terminer par le programmeur
 
donc, pour repondre, ta fonction doit accepter 2 chaines
une sera la source, et l'autre sera utilisee pour stocker le resultat
 

Code :
  1. void transforme (char * source, char * result)
  2. {
  3.     int i;
  4.     for(i = 0; source[i] != '\0'; i++)
  5.     {
  6.         result[i] = source[i]; /* traitement a effectuer ici */
  7.     }
  8. }
  9. main()
  10. {
  11.     char mot[6], result[6];
  12.     transforme(mot, result);
  13. }


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 26-04-2002 à 18:07:08    

HelloWorld a écrit a écrit :

Euh, en fait j'ai repondu trop vite ;)
pas besoin du char * dans ton cas ... la chaine passee en parametre est directement modifiee ... pas besoin de retourner quoi que ce soit
de plus, mot = transforme (mot) est tres mauvais .. :)
 
et ca doit aussi etre la cause de ton erreur lvalue
mot est un tableau, pas une variable que tu peux librement re-affecter
2 raisons : en la reaffectant, tu perds la memoire qu'utilsait tableau avant (les 6 caracteres) et tu ne peux plus les utiliser
            surtout, c'est un nombre ! une adresse definie par le compilateur, donc, un nombre
c'est comme si tu ecrivait :
 
10 = transforme (mot);
 
d'ou l'erreur left-value requise (lvalue required)
il a besoin d'une variable a gauche, or tu lui fournis un nombre
plus d'infos sur ca et plein d'autres pieges :
http://www.isty-info.uvsq.fr/~rume [...] .html#q_10
 
Desole pour zi_ril_wanou, mais je ne suis pas d'accord avec sa reponse
 
rien en effet ne garantit que la memoire qu'il alloue avec le malloc sera desallouee ...
 
un source tel que :

Code :
  1. main()
  2. {
  3.     char * mot = "test";
  4.     while(/* une condition*/)  mot = transforme(mot);
  5. }


 
aurait vite fait de satturer la memoire
une fonction doit effectuer un travail et c'est tout, et pas laisser une pertie du travail a terminer par le programmeur
 
donc, pour repondre, ta fonction doit accepter 2 chaines
une sera la source, et l'autre sera utilisee pour stocker le resultat
 

Code :
  1. void transforme (char * source, char * result)
  2. {
  3.     int i;
  4.     for(i = 0; source[i] != '\0'; i++)
  5.     {
  6.         result[i] = source[i]; /* traitement a effectuer ici */
  7.     }
  8. }
  9. main()
  10. {
  11.     char mot[6], result[6];
  12.     transforme(mot, result);
  13. }

 




 
Tout a fait d'accord avec le fait que je ne libère pas la mémoire.
Mais quand on en est au stade "mot" (de type char) = "fonction" (de type char *) pour recopier une chaîne de caractère, je m'adapte et vais au plus vite. Cela m'étonnerais fort que ded jay  ait besoin de connaître l'allocation, la libération mémoire : ce qu'il veut c'est une réponse là tout de suite à son "mini" problème et qu'il ne veut/peut se plonger dans le Kernighan & Ritchie. Après à chacun sa politique.

Reply

Marsh Posté le 26-04-2002 à 20:57:36    

ded jay a écrit a écrit :

j'aimerais faire une fonction ki reçoit en entrée une chaine de caractere et ki renvoi la meme modifiée




 

Code :
  1. void toto(char* chaine)
  2. {
  3. /* Contrôle des paramètres */
  4. if (chaine == (char*)NULL) return;
  5. /* Tu fais tes modifs sur la chaine */
  6. /* ... */
  7. }


La chaine doit déjà être allouée au début.

Code :
  1. #include<string.h>
  2. void main(int nb_arg, char* arg[])
  3. {
  4. char* chaine=(char*)NULL;
  5. chaine=strdup("YOOOOOOOOOOOOOOOOO" );
  6. toto(chaine);
  7. }


Voilà
 
par contre ta fonction de transformation peut retourner un int pour indiquer si une erreur se produit par exemple !!!

 

[jfdsdjhfuetppo]--Message édité par DarkOli le 26-04-2002 à 21:01:19--[/jfdsdjhfuetppo]


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 26-04-2002 à 21:11:47    

Citation :


char * transforme (char * heure)
{
int i;
 
if (heure[1] == ':';)
 {
 for (i=6;i>0;i--)
  heure[i] = heure[i-1];
 heure[i] = '0';
 }
 
return heure;
}


 
1 ptite remarque ...  
 
nulle part tu ne fais de test de longueur de chaine --> ca risque de planter dans la boucle si tu depasses les limites du tableau

Reply

Marsh Posté le 26-04-2002 à 21:11:47   

Reply

Marsh Posté le 26-04-2002 à 23:00:27    

Sinon : donc quand tu as "x:xx" tu mets "0x:xx" ?
 

Code :
  1. void main()
  2. {
  3. char heure[5 + 1];
  4. char res[5 + 1];
  5. /* Initialisation */
  6. sprintf(heure, "1:23" );
  7. res[0]='\0';
  8. /* traitement */
  9. transforme(heure,res);
  10. }
  11. void transforme(char* heure, char* res)
  12. {
  13. sprintf(res, "%s%s", strlen(heure)==4?"0":"", heure);
  14. }


 
Elle est toute petite la fonction maintenant ...

 

[jfdsdjhfuetppo]--Message édité par DarkOli le 26-04-2002 à 23:01:55--[/jfdsdjhfuetppo]


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 28-04-2002 à 11:47:54    

c kler :))
g plu besoin de la fonction maintenan, je peu ecrir la ligne direct ds le main
 
merci bcp

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed