vo mieux voir le dernier msg de ce topic pour comprendre le 1er ?? - C - Programmation
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.
Marsh Posté le 08-06-2005 à 23:56:44
voila ce qui arrive quand on utilise des outils pré-calcédonien
Marsh Posté le 08-06-2005 à 23:58:16
tmp = malloc(strlen(*v)+1);
Marsh Posté le 08-06-2005 à 23:59:12
malloc ?
(merde, j'ai marché sur un trilobite)
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
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)
Marsh Posté le 09-06-2005 à 00:03:25
tu compiles avec un compilo c++ ?
Marsh Posté le 09-06-2005 à 00:04:11
BIN FAIS DU C++ ALORS §§§§§
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)
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??
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 * |
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
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
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 |
Essaye de vider une bouteille d'un litre et demi pleine dans un verre
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)
D'ailleurs utiliser strncpy plutôt que strcpy est en général une bonne idée.
Marsh Posté le 09-06-2005 à 00:22:43
char *temp=NULL;
bin merde, c'st marqué noir sur blanc dans ton code
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
Marsh Posté le 09-06-2005 à 00:36:13
chrisbk, tu prends ?
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 :
|
(cela dit ma solution c'est du pur code de merde (tm), mais bon )
(Vive le C, tout ce bordel pour une copie de chaine de caractere...)
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
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
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
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 ^^
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
Marsh Posté le 09-06-2005 à 00:45:13
allez un grand merci !
;-) j retourne Cer ( verbe = faire du C)
Marsh Posté le 09-06-2005 à 00:49:27
chrisbk a écrit : char tmp[256] |
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 !
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 )
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] |
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
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 ?
Marsh Posté le 09-06-2005 à 01:19:03
Citation :
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 :
|
Marsh Posté le 09-06-2005 à 01:33:44
qu'est ce qui ne va pas dans ces fucking boucles ..?
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 !
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.
Marsh Posté le 09-06-2005 à 09:50:20
chrisbk a écrit : mais evidemment nom d'un sexe de poulet |
Arrête ! Je me marre tellement tout seul à mon bureau que mes collegues me prennent pour un dingue... J'en peux plus...
Marsh Posté le 09-06-2005 à 09:59:10
fullnight a écrit : |
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.
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
Marsh Posté le 09-06-2005 à 11:50:04
Citation :
|
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.
Marsh Posté le 08-06-2005 à 23:54:20
Pourquoi strcpy fait-il planter mon programme?
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