Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1860 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
 Page :   1  2  3  4  5  6
Page Précédente
Auteur Sujet :

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

n°1113388
fullnight
Posté le 08-06-2005 à 23:54:20  profilanswer
 

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
mood
Publicité
Posté le 08-06-2005 à 23:54:20  profilanswer
 

n°1113392
elianor
bannie 17 fois
Posté le 08-06-2005 à 23:55:48  profilanswer
 

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 §§§§§§§§
n°1113395
chrisbk
-
Posté le 08-06-2005 à 23:56:44  profilanswer
 

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


---------------
NP: HTTP Error 764 Stupid coder found
n°1113398
fullnight
Posté le 08-06-2005 à 23:57:41  profilanswer
 

l'allouer en faisant ?

n°1113403
chrisbk
-
Posté le 08-06-2005 à 23:58:16  profilanswer
 

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


---------------
NP: HTTP Error 764 Stupid coder found
n°1113405
elianor
bannie 17 fois
Posté le 08-06-2005 à 23:59:12  profilanswer
 

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


---------------
JE JE SUIS LIBERTINEEEEEEEEEEE JE SUIS UNE CATINNNNNNNNN §§§§§§§§
n°1113407
chrisbk
-
Posté le 09-06-2005 à 00:02:23  profilanswer
 

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
n°1113408
fullnight
Posté le 09-06-2005 à 00:02:42  profilanswer
 

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
n°1113410
chrisbk
-
Posté le 09-06-2005 à 00:03:25  profilanswer
 

tu compiles avec un compilo c++ ?


---------------
NP: HTTP Error 764 Stupid coder found
n°1113411
fullnight
Posté le 09-06-2005 à 00:03:50  profilanswer
 

yop exact

mood
Publicité
Posté le 09-06-2005 à 00:03:50  profilanswer
 

n°1113414
chrisbk
-
Posté le 09-06-2005 à 00:04:11  profilanswer
 

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


---------------
NP: HTTP Error 764 Stupid coder found
n°1113416
fullnight
Posté le 09-06-2005 à 00:04:59  profilanswer
 

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

n°1113418
chrisbk
-
Posté le 09-06-2005 à 00:05:53  profilanswer
 

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
n°1113422
fullnight
Posté le 09-06-2005 à 00:09:41  profilanswer
 

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??

n°1113425
chrisbk
-
Posté le 09-06-2005 à 00:14:06  profilanswer
 

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
n°1113441
fullnight
Posté le 09-06-2005 à 00:22:10  profilanswer
 

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

n°1113443
Pillow
'cos the trees won't talk
Posté le 09-06-2005 à 00:22:37  profilanswer
 

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
n°1113445
chrisbk
-
Posté le 09-06-2005 à 00:22:43  profilanswer
 

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


---------------
NP: HTTP Error 764 Stupid coder found
n°1113452
fullnight
Posté le 09-06-2005 à 00:34:18  profilanswer
 

'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
n°1113455
elianor
bannie 17 fois
Posté le 09-06-2005 à 00:36:13  profilanswer
 

chrisbk, tu prends ?


---------------
JE JE SUIS LIBERTINEEEEEEEEEEE JE SUIS UNE CATINNNNNNNNN §§§§§§§§
n°1113456
chrisbk
-
Posté le 09-06-2005 à 00:38:34  profilanswer
 

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
n°1113458
fullnight
Posté le 09-06-2005 à 00:40:10  profilanswer
 

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
n°1113459
chrisbk
-
Posté le 09-06-2005 à 00:40:39  profilanswer
 

:cry:


---------------
NP: HTTP Error 764 Stupid coder found
n°1113460
chrisbk
-
Posté le 09-06-2005 à 00:41:27  profilanswer
 

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
n°1113463
chrisbk
-
Posté le 09-06-2005 à 00:42:20  profilanswer
 

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
n°1113466
fullnight
Posté le 09-06-2005 à 00:43:30  profilanswer
 

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
n°1113467
chrisbk
-
Posté le 09-06-2005 à 00:44:04  profilanswer
 

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
n°1113468
fullnight
Posté le 09-06-2005 à 00:45:13  profilanswer
 

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

n°1113471
elianor
bannie 17 fois
Posté le 09-06-2005 à 00:49:27  profilanswer
 

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 §§§§§§§§
n°1113473
Pillow
'cos the trees won't talk
Posté le 09-06-2005 à 00:50:24  profilanswer
 

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
n°1113476
chrisbk
-
Posté le 09-06-2005 à 00:50:42  profilanswer
 

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
n°1113481
push
/dev/random
Posté le 09-06-2005 à 00:58:25  profilanswer
 

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

n°1113486
fullnight
Posté le 09-06-2005 à 01:19:03  profilanswer
 

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
n°1113500
fullnight
Posté le 09-06-2005 à 01:33:44  profilanswer
 

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


Message édité par fullnight le 09-06-2005 à 02:05:19
n°1113517
afbilou
pouet your life
Posté le 09-06-2005 à 05:33:06  profilanswer
 

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:

n°1113548
chrisbk
-
Posté le 09-06-2005 à 08:44:45  profilanswer
 

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.

n°1113594
Emmanuel D​elahaye
C is a sharp tool
Posté le 09-06-2005 à 09:50:20  profilanswer
 

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/
n°1113604
Emmanuel D​elahaye
C is a sharp tool
Posté le 09-06-2005 à 09:59:10  profilanswer
 

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/
n°1113757
fullnight
Posté le 09-06-2005 à 11:46:21  profilanswer
 

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

n°1113766
fullnight
Posté le 09-06-2005 à 11:50:04  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  6
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
vaut il mieux 200 000 lignes en une table ou 50 tables de400 lignes ?Imprimer c'est bien, y'arriver c'est mieux !
Editeur bbcode, en mieux (sans les tags), lequel ?[obsolète Mon script s'occupe que du dernier mot de la BDD..
tableau 100% sa marche mais euuuuh lire pour comprendre le prob ...Moi pas comprendre MSDN !!
Recuperer une donnée par rapport au dernier IDPlus de frames: Alors, quoi de mieux? ^^
Comment savoir si on est sur le dernier element d'un foreachun dernier exo C++
Plus de sujets relatifs à : vo mieux voir le dernier msg de ce topic pour comprendre le 1er ??


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR