> Tous les forumsAutres langages

 code qui ne marche pas en C ansi
Statut du sujet : NON RESOLU Imprimer
 pigpen
  Posté le 05/10/2005 @ 20:56  
 Petit astucien

35 Messages
Bonjour je suis un debutant en C ( ansi de preference ) et je ne comprend pas pourquoi ce bout de code ne fonctionne pas #include <stdio.h> #include <ctype.h> char* saisie_chaine(void){ char *s2; char tmp ; int cmpt = 0 ; tmp = getchar(); while(!isspace(tmp)){ s2 = (char *)realloc(s2,strlen(s2)+1); *(s2+cmpt)=tmp ; tmp = getchar() ; cmpt += 1; } return s2; } int main (int argc, char** argv ) { printf("%s \n",saisie_chaine() ); return 0; } but : lire une string au clavier la mettre ds un char* dynamic et récuperer ce qu'on a taper avant un space si il y en a un merci d'avance ( vive le java ;) )
 Afficher le profil de pigpen Envoyer un message privé à pigpen
 
 
Publicité
 pigpen  Posté le 05/10/2005 à 21:00  
Petit astucien

35 Messages
la reponse de mon gcc préferé c'est a l'execution : *** glibc detected *** realloc(): invalid pointer: 0x08049704 *** Aborted
Afficher le profil de pigpen Voir la configuration de pigpenEnvoyer un message privé à pigpen
  Revenir en haut de la page
 breizhbugs  Posté le 05/10/2005 à 22:27  
Astucien

3001 Messages
Salut, il faut que s2 soit determiné peut etre: #include <stdio.h> #include <ctype.h> char* saisie_chaine(void) { __char *s2=NULL; __char tmp ; __int cmpt = 0 ; __tmp = getchar(); __while(!isspace(tmp)) __{ ____s2 = (char *)realloc(s2,strlen(s2)+1); ____*(s2+cmpt)=tmp ; ____tmp = getchar() ; ____cmpt += 1; __} __return s2; } int main (int argc, char** argv ) { __printf("%s \n",saisie_chaine() ); __return 0; }
Afficher le profil de breizhbugs Voir la configuration de breizhbugsEnvoyer un message privé à breizhbugs
 Revenir en haut de la page
 aliquando  Posté le 06/10/2005 à 08:51  
Petit astucien

106 Messages
euh realloc te permet de modifier la taille d'un tableau existant, dans ton cas s2 n'est pas alloue donc il te faut au moins un alloc ce que tu peux faire c : [code] char *saisie_chaine() { char *s2 = malloc(256); // tu reserves bcp inutilement :p int moncar = getchar(); int index = 0; while(!isspace(moncar)) { s2[index] = moncar; index++; } s2[index] = '\\0'; // tu fermes ta string char *res = strdup(s2); // pour copier la taille necessaire free(s2); return res; } [/code]
Afficher le profil de aliquandoEnvoyer un message privé à aliquando
  Revenir en haut de la page
 breizhbugs  Posté le 06/10/2005 à 18:10  
Astucien

3001 Messages
aliquando a écrit :
euh realloc te permet de modifier la taille d'un tableau existant, dans ton cas s2 n'est pas alloue donc il te faut au moins un alloc ce que tu peux faire c : [code] char *saisie_chaine() { char *s2 = malloc(256); // tu reserves bcp inutilement :p int moncar = getchar(); int index = 0; while(!isspace(moncar)) { s2[index] = moncar; index++; } s2[index] = '\\\\0'; // tu fermes ta string char *res = strdup(s2); // pour copier la taille necessaire free(s2); return res; } [/code]
T'as mal dû lire la doc: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/HTML/_crt_realloc.asp "The realloc function changes the size of an allocated Memory block. The memblock argument points to the beginning of the Memory block. If memblock is NULL, realloc behaves the same way as malloc and allocates a new block of size bytes. If memblock is not NULL, it should be a pointer returned by a previous call to calloc, malloc, or realloc." Le but est justement de n'allouer que le strict necessaire!

Modifié par breizhbugs le 06/10/2005 18:10
Afficher le profil de breizhbugs Voir la configuration de breizhbugsEnvoyer un message privé à breizhbugs
 Revenir en haut de la page
 pigpen  Posté le 06/10/2005 à 18:39  
Petit astucien

35 Messages
dans ce cas si le realloc est possible d'ou viens le souci ? j'ai ajouter le include je sais plus koi pour utiliser "isspace" mais rien tjrs rien ... raaa un tit algo comme ca et j'ai deja la tete dans le mur c'est triste ...
Afficher le profil de pigpen Voir la configuration de pigpenEnvoyer un message privé à pigpen
  Revenir en haut de la page
 breizhbugs  Posté le 06/10/2005 à 20:54  
Astucien

3001 Messages
Salut, je sais: strlen demande une chaine de caractere a zero terminal pour fonctionner ce qui veut dire que ton algo ne marche pas car: 1- tu commence avec un pointer null, donc pas de zero terminal dans ta chaine pointee par s2 2- *(s2+cmpt)=tmp ; cette ligne ajoute le caractere entree au clavier en derniere position, ce qui veut dire que tu ecraserai le '\\0' a chaque fois donc strlen ne marcherai pas au pas suivant de la boucle. le mieux est que tu te passes de strlen: #include <stdio.h> #include <ctype.h> char* saisie_chaine(void) { __char *s2=NULL; __char tmp ; __int cmpt = 0 ; __tmp = getchar(); __while(!isspace(tmp)) __{ ____s2 = (char *)realloc(s2,cmpt+1); ____*(s2+cmpt)=tmp ; ____tmp = getchar() ; ____cmpt += 1; __} __s2 = (char *)realloc(s2,cmpt+1); __*(s2+cmpt)='\\\0' ; //On en fait une chaine a zero terminal! __return s2; }

Modifié par breizhbugs le 06/10/2005 20:56
Afficher le profil de breizhbugs Voir la configuration de breizhbugsEnvoyer un message privé à breizhbugs
 Revenir en haut de la page
Haut de la page 
Inscrivez-vous !
- Posez vos questions

- Résolvez vos problèmes

- Aidez les autres

- Participez et créez vos discussions

- Dialoguez en privé avec d'autres membres

- Suivez vos sujets préférés

- Affichez les signatures des membres

TOUT EST GRATUIT !

Je crée mon compte



Vous avez besoin d'aide ?
Des centaines d'experts sont à votre disposition sur les forums PC Astuces pour vous aider gratuitement, 24h/24, 7j/7.

Les derniers sujets résolus !
 

 > Tous les forumsAutres langages

 
Forum PC Astuces© 1997-2008 WebastucesAller en haut de la page