|
| 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 ;) )
|
| |
| |
| 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
|
| |
|
| 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;
}
|
| |
|
| 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] |
| |
|
| 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 |
| |
|
| 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 ... |
| |
|
| 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 |
| |
|
|
| Haut de la page |