comment on fé une fonction ki renvoie une chaine de caracteres ? [C] - C++ - Programmation
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]
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)
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 ?
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]
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 =
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 :
|
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 :
|
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 :
|
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.
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 :
|
La chaine doit déjà être allouée au début.
Code :
|
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]
Marsh Posté le 26-04-2002 à 21:11:47
Citation : |
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
Marsh Posté le 26-04-2002 à 23:00:27
Sinon : donc quand tu as "x:xx" tu mets "0x:xx" ?
Code :
|
Elle est toute petite la fonction maintenant ...
[jfdsdjhfuetppo]--Message édité par DarkOli le 26-04-2002 à 23:01:55--[/jfdsdjhfuetppo]
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
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