my_strdup

my_strdup - C - Programmation

Marsh Posté le 11-10-2007 à 12:24:41    

Voila mon sujet ;
Écrire une fonction qui alloue suffisament de memoire et copie la chaîne de caractère passée en argument. Elle renvoie un pointeur sur la nouvelle chaîne allouée.
 
J'ai code ceci:
 
void     *malloc();
 
void     my_putchar(char c)
{
  write(1, &c, 1);
}
 
int     my_strlen(char *str)
{
  int count;
 
  count = 0;
  while (*str++)
    {
      count++;
    }
  return (count);
}
 
char     *my_strcpy(char *dest, char *src)
{
  char *ret;
 
  ret = dest;
  while (*src)
    *dest++ = *src++;
  *dest = 0;
  return (ret);
}
 
char     *my_strdup(char *str)
{
  char *s;
 
  if ((s = malloc(my_strlen(str))) == 0)
    return (0);
  my_strcpy(s, str);
  return (s);
}
 
int     main(int ac, char **av)
{
  *my_strdup('essai');
  return(*str);
}
 
Quand je compile il me met que j'ai une erreur sur ce qui est en gras, mais je ne vois pas d'ou cela peut venir.

Reply

Marsh Posté le 11-10-2007 à 12:24:41   

Reply

Marsh Posté le 11-10-2007 à 12:26:47    

que str n'est pas déclaré ... et que t'as pas les bases du C vu la ligne précédente


Message édité par Taz le 11-10-2007 à 12:27:10
Reply

Marsh Posté le 11-10-2007 à 12:31:47    

XD C'est vrai.
Mais maintenant quand ja declare j'ai comme message d'erreur : warning: passing arg 1 of `my_strdup' makes pointer from integer without a cast


Message édité par Almazard le 11-10-2007 à 13:04:41
Reply

Marsh Posté le 11-10-2007 à 12:53:47    

compile avec plein de messages si vraiment tu ne vois pas le problème ...

 

superbe ta déclaration str


Message édité par Taz le 11-10-2007 à 12:54:08
Reply

Marsh Posté le 11-10-2007 à 12:55:21    

joli devoir, t'as pompé my_strdup à ton voisin mais t'arrive même pas à t'en servir. Il n'est pas trop tard, l'année n'a pas commencé depuis longtemps, reprends tout depuis le début

Reply

Marsh Posté le 11-10-2007 à 13:31:30    

Vivement la suite de l'exercice ...
http://forum.hardware.fr/hfr/Progr [...] 8558_1.htm ...

Reply

Marsh Posté le 11-10-2007 à 13:51:51    

Almazard a écrit :

Voila mon sujet ;
Écrire une fonction qui alloue suffisament de memoire et copie la chaîne de caractère passée en argument. Elle renvoie un pointeur sur la nouvelle chaîne allouée.
 
J'ai code ceci:
<...>
Quand je compile il me met que j'ai une erreur sur ce qui est en gras, mais je ne vois pas d'ou cela peut venir.


Déjà, tu devrais lire les règles du forum pour apprendre à rédiger ton post correctement. Le code doit être balisé comme il faut.
 
Ensuite, tu devrais mieux régler ton compilateur, parce que ce code est une abomination :  


Project   : Forums
Compiler  : GNU GCC Compiler (called directly)
Directory : C:\dev\forums\
--------------------------------------------------------------------------------
Switching to target: default
Compiling: main.c
main.c:1: warning: function declaration isn't a prototype
main.c: In function `my_putchar':
main.c:5: warning: implicit declaration of function `write'
main.c:43:14: warning: character constant too long for its type
main.c: In function `main':
main.c:43: warning: passing arg 1 of `my_strdup' makes pointer from integer without a cast
main.c:44: error: `str' undeclared (first use in this function)
main.c:44: error: (Each undeclared identifier is reported only once
main.c:44: error: for each function it appears in.)
main.c: At top level:
main.c:41: warning: unused parameter 'ac'
main.c:41: warning: unused parameter 'av'
Process terminated with status 1 (0 minutes, 5 seconds)
3 errors, 6 warnings


Ceci compile :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int my_strlen (char const *str)
  4. {
  5.    int count;
  6.    count = 0;
  7.    while (*str++)
  8.    {
  9.       count++;
  10.    }
  11.    return count;
  12. }
  13. char *my_strcpy (char *dest, char const *src)
  14. {
  15.    char *ret = dest;
  16.    while (*src)
  17.    {
  18.       *dest++ = *src++;
  19.    }
  20.    *dest = 0;
  21.    return ret;
  22. }
  23. char *my_strdup (char const *str)
  24. {
  25.    char *s = malloc (my_strlen (str) + 1);
  26.    if (s != NULL)
  27.    {
  28.       my_strcpy (s, str);
  29.    }
  30.    return s;
  31. }
  32. int main (void)
  33. {
  34.    char *s = my_strdup ("essai" );
  35.    if (s != NULL)
  36.    {
  37.       printf ("'%s'\n", s);
  38.       free (s), s = NULL;
  39.    }
  40.    return 0;
  41. }


Pose des questions si tu ne comprends pas.


Message édité par Emmanuel Delahaye le 11-10-2007 à 14:06:12

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 11-10-2007 à 18:00:24    

Je n'ai pas le droit d'utiliser printf, mais seulement my_putchar.
 
NULL est égal à 0 ? Je ne vois pas où tu as mis que NULL est égal à zéro ? On met ça dans un #define ?

Reply

Marsh Posté le 11-10-2007 à 18:22:30    

Almazard a écrit :

Je n'ai pas le droit d'utiliser printf, mais seulement my_putchar.


allo, c'est un exemple.

 

PS: nous apprecions tous ton my_putchar dont l'implémentation repose sur du pas standard.


Message édité par Taz le 11-10-2007 à 18:23:09
Reply

Marsh Posté le 11-10-2007 à 18:34:56    

Almazard a écrit :

Je n'ai pas le droit d'utiliser printf, mais seulement my_putchar.
 
NULL est égal à 0 ? Je ne vois pas où tu as mis que NULL est égal à zéro ? On met ça dans un #define ?


Ca a longtemps été défini dans stdio.h. Aujourd'hui je suis pas sûr mais il me semble que c'est défini ailleurs mais sais plus trop où. De toute façon tout le monde s'en fout de savoir où c'est défini et aussi de sa valeur. C'est le principe des macro => utiliser un mnémonique à la place d'une valeur => si la valeur change, il suffit de recompiler et ça remarche. Mais pour info, NULL n'est pas égal à 0, il est égal à "(void *)0" (où autrement dit "zéro converti en adresse" ). Comme le dit Taz, il n'est pas trop tard pour s'y (re)mettre un peu plus sérieusement...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 11-10-2007 à 18:34:56   

Reply

Marsh Posté le 11-10-2007 à 19:03:18    

Almazard a écrit :

Je n'ai pas le droit d'utiliser printf, mais seulement my_putchar.


Je te laisse faire les boucles qui vont bien (ou la fonction, genre my_puts()...)

Citation :

NULL est égal à 0 ? Je ne vois pas où tu as mis que NULL est égal à zéro ? On met ça dans un #define ?


Mais qu'est-ce qu'on vous apprend dans cette école ? Ca fait partie de la définition du langage C. Dans le contexte pointeur, NULL vaut 0 (null pointer constant). C'est défini dans <stddef.h> qui est lui même inclus dans la plupart des headers standards (<stdio.h>, <stdlib.h> etc.)


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 11-10-2007 à 19:24:19    

Jusque maintenant on n'a eu le droit d'utiliser seulement les fonctions que l'on a nous même codé, donc on n'a pas eu le droit à lib stdio.h

Reply

Marsh Posté le 11-10-2007 à 19:49:21    

epitech powa...
 
par contre t'es en piscine aussi...
 
interdiction de leecher du code sur le net...
ou -42... au choix :)


---------------
"Se tromper est humain ; Vraiment foutre la merde necessite le mot de passe de root."
Reply

Marsh Posté le 11-10-2007 à 19:51:39    

Almazard a écrit :

Jusque maintenant on n'a eu le droit d'utiliser seulement les fonctions que l'on a nous même codé, donc on n'a pas eu le droit à lib stdio.h


C'est normal. Ca te permet de comprendre comment sont faites les choses. Tu ne sauras jamais pourquoi le C inclu un caractère nul dans ses chaînes si t'as pas écrit au-moins une fois dans ta vie un clone de strlen()...


Message édité par Sve@r le 11-10-2007 à 19:52:22

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 11-10-2007 à 20:01:51    

idem tu comprendras jamais d'ou viennent tes erreurs avec printf si tu l'as jamais recrit plus intelligemment (quelle merde printf au passage)


---------------
"Se tromper est humain ; Vraiment foutre la merde necessite le mot de passe de root."
Reply

Marsh Posté le 11-10-2007 à 20:48:13    

peyo22 a écrit :

quelle merde printf au passage

 

La je crois que tu aurai smieux fait de te taire :o
-42, c'ets votre QI moyen à l'epitech c'ets ç a?

Message cité 1 fois
Message édité par Joel F le 11-10-2007 à 20:52:18
Reply

Marsh Posté le 11-10-2007 à 22:33:23    

Joel F a écrit :


 
La je crois que tu aurai smieux fait de te taire :o
-42, c'ets votre QI moyen à l'epitech c'ets ç a?


ou pas... quel est l'interet de bufferiser ce que tu donnes a manger a printf ? tu m'expliques?
pis printf+write ca vole violemment....
 
et no comment pour le reste :) je ne mange pas de ce pain la mon grand


---------------
"Se tromper est humain ; Vraiment foutre la merde necessite le mot de passe de root."
Reply

Marsh Posté le 12-10-2007 à 02:20:40    

peyo22 a écrit :


ou pas... quel est l'interet de bufferiser ce que tu donnes a manger a printf ? tu m'expliques?
pis printf+write ca vole violemment....
 
et no comment pour le reste :) je ne mange pas de ce pain la mon grand


Tu crois vraiment qu'ils se sont amusés à compliquer l'écriture du printf pour s'amuser ?
 
 
 
 
 
 
Pour ne pas te laisser dans l'ignorance, voici le concept : http://www.pixelbeat.org/programming/stdio_buffering/

Reply

Marsh Posté le 12-10-2007 à 08:34:07    

peyo22 a écrit :


ou pas... quel est l'interet de bufferiser ce que tu donnes a manger a printf ? tu m'expliques?


Tu comprendras quand tu seras grand :o

Reply

Marsh Posté le 12-10-2007 à 18:28:46    

peyo22 a écrit :


ou pas... quel est l'interet de bufferiser ce que tu donnes a manger a printf ? tu m'expliques?


C'est probablement parce que les grandes familles de printf (fprintf, sprintf, etc) travaillent toutes à partir d'une fonction de base et que la bufferisation se fait là...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

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