vo mieux voir le dernier msg de ce topic pour comprendre le 1er ??

vo mieux voir le dernier msg de ce topic pour comprendre le 1er ?? - C - Programmation

Marsh Posté le 08-06-2005 à 23:54:20    

Pourquoi strcpy fait-il planter mon programme?
 

Code :
  1. #include "stdio.h"
  2. #include "string.h"
  3. void fonction3(char *chaine,char **v);
  4. int main(void)
  5. {
  6. char * filtre="atvg";
  7. static char *vect[]={"Dupont","Durant","Tintin",NULL};
  8. fonction3(filtre,vect);
  9. return 0;
  10. }
  11. void fonction3(char * chaine, char **v)
  12. {
  13. char *temp=NULL;
  14. while(*v)
  15. {
  16.  strcpy(temp, *v);
  17.  puts(*v);
  18.  //while(**v!='\0'){}
  19.  *v++;
  20. }
  21. }


 
 
but de l'exercice :
 
soit un vecteur de pointeurs pointant vers des noms de personnes. creer une fonction qui reçoit une chaîne de caractères et ce vecteur, et met toutes les chaînes en majuscules sauf les caractères de la chaîne qui restent en minuscules.


Message édité par fullnight le 09-06-2005 à 22:49:35
Reply

Marsh Posté le 08-06-2005 à 23:54:20   

Reply

Marsh Posté le 08-06-2005 à 23:55:48    

parce que strcpy ne fait pas d'allocation pour la chaine destination. A toi de l'allouer à la bonne taille avant d'appeler strcpy.


---------------
JE JE SUIS LIBERTINEEEEEEEEEEE JE SUIS UNE CATINNNNNNNNN §§§§§§§§
Reply

Marsh Posté le 08-06-2005 à 23:56:44    

voila ce qui arrive quand on utilise des outils pré-calcédonien


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 08-06-2005 à 23:57:41    

l'allouer en faisant ?

Reply

Marsh Posté le 08-06-2005 à 23:58:16    

tmp = malloc(strlen(*v)+1);
 
 


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 08-06-2005 à 23:59:12    

malloc ?
 
(merde, j'ai marché sur un trilobite)


---------------
JE JE SUIS LIBERTINEEEEEEEEEEE JE SUIS UNE CATINNNNNNNNN §§§§§§§§
Reply

Marsh Posté le 09-06-2005 à 00:02:23    

sinon si t'es sur un truc un peu moderne (genre au niveau de l'etre pluri cellulaire), tu peux remplacer malloc + strcpy par strdup


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 09-06-2005 à 00:02:42    

yeahh ca marche ! à condition bien sur de faire le transtypage (char *)  devant le malloc !
 
excellent , merci!
 
maintenant n'y a-t-il aucun autre moyen que celui d'employer malloc?
 
 
 
désolé pour stdrup( j dois employer QUE les fonctions vues en classe.. et pour stdrup ce n'est pas le cas)


Message édité par fullnight le 09-06-2005 à 00:03:37
Reply

Marsh Posté le 09-06-2005 à 00:03:25    

tu compiles avec un compilo c++ ?


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 09-06-2005 à 00:03:50    

yop exact

Reply

Marsh Posté le 09-06-2005 à 00:03:50   

Reply

Marsh Posté le 09-06-2005 à 00:04:11    

BIN FAIS DU C++ ALORS §§§§§


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 09-06-2005 à 00:04:59    

désolé il s'agit d'un exercice à faire en C

Reply

Marsh Posté le 09-06-2005 à 00:05:53    

bin utilise un compilo C alors (en C la conversion void * => pointeur de n'importe quel type est implicite, idem dans l'autre sens)


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 09-06-2005 à 00:09:41    

je suis au courant , mais en classe on doit préciser vers quel type on veut transtyper alors c'est pourquoi j'ai précisé char * plutot que void *
 
 
 
mais que veut dire la phrase  
 
"parce que strcpy ne fait pas d'allocation pour la chaine destination"
 
?????
 
normalement quand je fais un strcpy il place une chaine dans une autre  
non??
c'est dans quel cas que je dois voir la taille??

Reply

Marsh Posté le 09-06-2005 à 00:14:06    

fullnight a écrit :

je suis au courant , mais en classe on doit préciser vers quel type on veut transtyper alors c'est pourquoi j'ai précisé char * plutot que void *
 
 
 
mais que veut dire la phrase  
 
"parce que strcpy ne fait pas d'allocation pour la chaine destination"
 
?????
 
normalement quand je fais un strcpy il place une chaine dans une autre  
non??
c'est dans quel cas que je dois voir la taille??


 
soyons precis
 
strcpy parcours la mémoire que tu lui as donné en source et la copie dans l'endroti que tu lui as donné en destination, ce jusqu'a rencontrer la valeur 0
 
ni plus, ni moins. Donc tu vois, il faut qu'elle puisse ecrire a un endroit valide de la mémoire, sinon bin ca plante
 
 


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 09-06-2005 à 00:22:10    

et tu trouves que l'endroit mémoire *temp n'est pas valide toi?? je vois pas pq

Reply

Marsh Posté le 09-06-2005 à 00:22:37    

fullnight a écrit :

je suis au courant , mais en classe on doit préciser vers quel type on veut transtyper alors c'est pourquoi j'ai précisé char * plutot que void *

Sauf que là ton compilateur se plaint (probablement) parce que tu n'as pas inclus stdlib.h... Et ton cast masque l'erreur, ce qui est la raison principale pour laquelle caster un malloc n'est pas une très bonne idée...
 
Moi je me demande pourquoi vect est en static? Et pourquoi tu rajoutes un NULL à la fin? Et pourquoi #include "stdio.h" et non #include <stdio.h> (juste pour être original?) ? Et pourquoi tu ne mets pas l'étoile au même endroit (char * filtre, char *vect)?
 
Précisons aussi que pour la solution donnée par chrisbk, il faut faire l'allocation et la désallocation DANS la boucle, sans quoi tu risques la segfault si tu as une chaine plus longue que la première dans v.
 
 

Citation :

normalement quand je fais un strcpy il place une chaine dans une autre  
non??

Essaye de vider une bouteille d'un litre et demi pleine dans un verre [:petrus75]  
C'est du C, les chaines de caractères ne sont jamais que des tableaux. Si le tableau de destination (le verre) est trop petit, ça déborde (segfault) :o  
 
D'ailleurs utiliser strncpy plutôt que strcpy est en général une bonne idée.


Message édité par Pillow le 09-06-2005 à 00:24:57
Reply

Marsh Posté le 09-06-2005 à 00:22:43    

char *temp=NULL;
 
 
bin merde, c'st marqué noir sur blanc dans ton code


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 09-06-2005 à 00:34:18    

'tain c'est quoi ca !
La prof nous a pas enseigné la fct strncpy et je ne peux donc pas l'employer à son exercice.
 
j'ai inclus "conio.h" pour finir ,ca remplace bien stdlib il se plaint pas le compilo.( je c dans le bout de code ici on le voit pas mais je l'ai rajouté dans mon code par après).j'employe les"" plutot que les <> car on nous a appris ca comme ca et ca marche aussi. je fais du C. pas de problèmes.
 
j'ai mis static j'ai pas de raison de le mettre en effet, mais ca marche quand même.
 
 
si j'ai mis NULL à la fin c'est pour avoir une fin à ce vecteur de pointeurs sur char.
 
effectivement dans la fonction 3 j'employe simplement while(*v)
 
ca facilite mon écriture.
je n'avais pas envie de faire une boucle for et y balancer la taille du vecteur .. etc
 
 
- si j'ai mis char *temp=NULL; c'est pour que je n'ai pas un ptr fou ! si je mets rien y'a un warning.. alors voila pq mon NULL, et j dois mettre quoi alors?
 
si j'ai mis un espace entre (char * filtre, char *vect) et pas l'autre c'est parce qu'il est minuit 38 et je suis pas attentif.
 
 
bon je voudrais trouver un moyen pour régler ca SANS malloc , strncpy ,stdrup


Message édité par fullnight le 09-06-2005 à 00:37:20
Reply

Marsh Posté le 09-06-2005 à 00:36:13    

chrisbk, tu prends ?


---------------
JE JE SUIS LIBERTINEEEEEEEEEEE JE SUIS UNE CATINNNNNNNNN §§§§§§§§
Reply

Marsh Posté le 09-06-2005 à 00:38:34    

Mais cre-de-vin-dieu, la DESTINATION de str(n)cpy DOIT etre une ZONE MEMOIRE VALIDE, donc soit tu l'alloue dynamiquement (le top), soit statiqument (beurf), mais tu L'ALLOUES
 
(Saint Luc2, venez moi en aide)
 
char * temp = NULL signifie "salut, y'a une zone memoire qqpart, si tu veux y aller suis les fleches "tmp". ce que fait strcpy qui va donner dans ton NULL et donc planter lamentablement
 
bref, donc vu que tu es allergique a malloc on va faire sans
 

Code :
  1. char tmp[256]
  2. memset(tmp,0,256);
  3. strncpy(tmp, *v, 256);


 
(cela dit ma solution c'est du pur code de merde (tm), mais bon [:vague nocturne])
 
 
 
(Vive le C, tout ce bordel pour une copie de chaine de caractere...)
 


Message édité par chrisbk le 09-06-2005 à 00:39:31

---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 09-06-2005 à 00:40:10    

que je mette NULL ou pas a char *temp ca plante quand meme lamentablement
 
 
 
et pas de memset ni de strncpy j peux pas employer ca on n'a pas vu c pas que je veux pas c que je peux pas


Message édité par fullnight le 09-06-2005 à 00:41:21
Reply

Marsh Posté le 09-06-2005 à 00:40:39    

:cry:


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 09-06-2005 à 00:41:27    

fullnight a écrit :

que je mette NULL ou pas a char *temp ca plante quand meme lamentablement


 
mais evidemment nom d'un sexe de poulet, parce que
 
char * tmp; pointe vers que dalle, enfni, si, mais pas vers une ZONE MEMOIRE VALIDE
 


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 09-06-2005 à 00:42:20    

char tmp[256]
strcpy(tmp, *v);
 
et oui jean pierre, c'est mon dernier mot, et dieu m'es temoin que c'est la mort dans l'ame quand je poste du code aussi laid


Message édité par chrisbk le 09-06-2005 à 00:42:44

---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 09-06-2005 à 00:43:30    

désolé pour tout les gars je suis a gifler !!
 
je viens de voir une phrase dans mon cours " strcpy a besoin de deux chaines de même longueur"
 
sorry les amis !!
c'est a moi de dire a char* temp d'avoir 7 places ^^


Message édité par fullnight le 09-06-2005 à 00:49:10
Reply

Marsh Posté le 09-06-2005 à 00:44:04    

fullnight a écrit :

désolé pour tout les gars je suis a gifler !!


 
bon bin comme quoi on arrive a tomber d'accord [:zaib3k]


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 09-06-2005 à 00:45:13    

allez un grand merci !
 
;-) j retourne Cer ( verbe = faire du C)

Reply

Marsh Posté le 09-06-2005 à 00:49:27    

chrisbk a écrit :

char tmp[256]
strcpy(tmp, *v);


 
C'est quoi cet horreur ? Tu veux te faire bannir ?
 
fullnight, si le prog te donne une bonne note avec ce code, change d'école !


---------------
JE JE SUIS LIBERTINEEEEEEEEEEE JE SUIS UNE CATINNNNNNNNN §§§§§§§§
Reply

Marsh Posté le 09-06-2005 à 00:50:24    

fullnight a écrit :

j'ai inclus "conio.h" pour finir ,ca remplace bien stdlib il se plaint pas le compilo.


Ça remplace très mal stdlib, vu que c'est spécifique à ton système -- ce n'est pas du C (moi à la place du prof je t'enleverais un point rien que pour ça :o )
 

Citation :

j'employe les"" plutot que les <> car on nous a appris ca comme ca et ca marche aussi. je fais du C. pas de problèmes.

Bien sûr que ça marche (tant que tu n'as pas l'idée de créer un stdio.h au mauvais endroit du moins) , c'est juste qu'habituellement on utilise <> pour les en-têtes système et "" pour les en-têtes utilisateur.
 

Citation :

si j'ai mis NULL à la fin c'est pour avoir une fin à ce vecteur de pointeurs sur char.

C'est inutile, c'est fait automatiquement.
 

chrisbk a écrit :

char tmp[256]
strcpy(tmp, *v);

Précisons que le jour où il utiliseras un mot de plus de 256 caractères dans vect, il aura un beau buffer overflow (débugage infernal,  plantage, voire faille de sécurité...).
 
 
 
Moi je te conseillerais de faire de ne pas t'en tenir à ce que te dis ton prof, c'est clairement un point positif, surtout si ça veut dire faire du code plus propre et plus sûr [:spamafote]


Message édité par Pillow le 09-06-2005 à 00:51:25
Reply

Marsh Posté le 09-06-2005 à 00:50:42    

elianor a écrit :

C'est quoi cet horreur ? Tu veux te faire bannir ?


 
c'est pas comme si j'avais pas essayé de lui proposer autre chose hein ?


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 09-06-2005 à 00:58:25    

et après y dit qu'il aime pas le C [:petrus75]

Reply

Marsh Posté le 09-06-2005 à 01:19:03    

Citation :


 

Citation :

si j'ai mis NULL à la fin c'est pour avoir une fin à ce vecteur de pointeurs sur char.

C'est inutile, c'est fait automatiquement.


 
figure toi que NON ce n'est pas fait automatiquement je viens de tester et ca plante sans le NULL.
 
bon voici j'ai refait le code presque "comme il faut".
but du programme :  soit un vecteur de pointeurs pointant vers des noms de personnes. creer une fonction qui reçoit une chaîne de caractères et ce vecteur, et met toutes les chaînes en majuscules sauf les caractères de la chaîne qui restent en minuscules.
 

Code :
  1. ##include <stdio.h>
  2. #include <string.h>
  3. #include <conio.h>
  4. void fonction3(char *chaine,char **v);
  5. int main(void)
  6. {
  7.     short i;
  8. char *filtre="atvg";
  9. char *vect[]={"Dupont","Durant","Tintin",NULL};
  10. fonction3(filtre,vect);
  11.     for(i=0;i<3;i++) puts(vect[i]);     // ouin il affiche rien
  12. return 0;
  13. }
  14. void fonction3(char *chaine, char **v)
  15. {
  16. short i;
  17. while(*v)
  18. {
  19.  while(**v)
  20.  {
  21.   while(*chaine)
  22.     {
  23.          if( **v == *chaine) **v=(**v-32);
  24.                 chaine++;
  25.     }
  26.           *(*v)++;
  27.          }
  28.      *v++; 
  29.  }
  30. }


Message édité par fullnight le 09-06-2005 à 01:55:51
Reply

Marsh Posté le 09-06-2005 à 01:33:44    

qu'est ce qui ne va pas dans ces fucking boucles ..?


Message édité par fullnight le 09-06-2005 à 02:05:19
Reply

Marsh Posté le 09-06-2005 à 05:33:06    

fullnight a écrit :

pas de memset ni de strncpy j peux pas employer ca on n'a pas vu c pas que je veux pas c que je peux pas


Arrete d'essayer de te persuader qu'un prof va sanctionner un eleve autonome et ambitieux. Il te sanctionnera s'il voit que le code n'est pas de toi mais si tu sais lui expliquer tes choix et tes methodes il ne pourra que t'encourager ! :ange:

Reply

Marsh Posté le 09-06-2005 à 08:44:45    

fullnight a écrit :

qu'est ce qui ne va pas dans ces fucking boucles ..?


y'a pas grand chose qui va, en fait, surtout ta gestion de la variable "chaine". Utilise aussi la fonction toupper et pas ton bricolage.

Reply

Marsh Posté le 09-06-2005 à 09:50:20    

chrisbk a écrit :

mais evidemment nom d'un sexe de poulet


:lol: Arrête ! Je me marre tellement tout seul à mon bureau que mes collegues me prennent pour un dingue... J'en peux plus...


---------------
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 09-06-2005 à 09:59:10    

fullnight a écrit :


j'ai inclus "conio.h" pour finir ,ca remplace bien stdlib il se plaint pas le compilo.( je c dans le bout de code ici on le voit pas mais je l'ai rajouté dans mon code par après).j'employe les"" plutot que les <> car on nous a appris ca comme ca et ca marche aussi. je fais du C. pas de problèmes.


C'est n'importe quoi. <conio.h> n'est pas standard. Les <> au lieu de "", c'est pas de la déco. C'est indispensable pour être portable. Si c'est ça qu'on t'enseigne dans cette école, quitte la et fait toi rembourser. C'est de l'arnaque.


---------------
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 09-06-2005 à 11:46:21    

on ne nous enseigne pas la portabilité.... faute de temps peut-être..
 
ok j'ai mis stdlib  
 
tj est il que je voudrais bien savoir ce qui ne va pas dans mes boucles !!
 
 
pour info toupper a besoin d'un int ! moi je bosse avec des char !
 
et désolé pour le bricolage mais le prof a demandé a ce que l'on n'employe PAS toupper mais sa propre fonction pour transformer en MAJ ! ici je fais rapide (sans fonction )mais le résultat devrait y etre .
 
qqun peut me dire ce qui ne va pas dans ces boucles?
car quand je veux afficher les chaines transformées  
il ne m'affiche que DDDD

Reply

Marsh Posté le 09-06-2005 à 11:50:04    

Citation :

afbilou a écrit :

Arrete d'essayer de te persuader qu'un prof va sanctionner un eleve autonome et ambitieux. Il te sanctionnera s'il voit que le code n'est pas de toi mais si tu sais lui expliquer tes choix et tes methodes il ne pourra que t'encourager ! :ange:




 
 
désolé on ne peut bosser qu'avec les fonctions qu'on a vues,(on programme sur papier en +)je ne pourrai rien expliquer
sans doutes que ce serait plus facile si j'employais celles dont vous me parlez.


Message édité par fullnight le 09-06-2005 à 11:56:43
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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