Taille de chaine de caractères dynamique... [C] - C++ - Programmation
Marsh Posté le 08-05-2003 à 12:04:25
Ok mais comment faire pour juste rentré une chaine de caractere sans spécifier la taille et que le prog allou tout seul soi 4 char soi 4000000 char (selon taille de la chaine entrée).
Ca serai sympa de m'expliquer un peu ou si il ya avai un tuto !
merci
Marsh Posté le 08-05-2003 à 13:33:59
ben en fait fgets stocke à l'adrese donnée une chaine, '\n' final compris, sauf si la chaine etait plus longue, auquel cas il ne le fait pas. donc en pseudo C et sans vrai traitement d'erreur
Code :
|
enfin j'ecris ça a chaud le ventre vide, à toi de veriifer l'algo
Marsh Posté le 08-05-2003 à 20:22:57
ya une couille voila mon code
Code :
|
Le pb C que si je rentre une chaine genre "le petit chat est mort", le resultat dans la variable est "at est mort".
Ou est passé le reste ??
J'avou que G un peu de mal avec tout ce qui est pointeur et mémoire...
Merci de ton aide
Marsh Posté le 08-05-2003 à 21:52:30
Jardy a écrit : ya une couille voila mon code
|
Parce que tu reecris sur la meme zone
De plus le doublement de la capacite a chaque iteration, je ne suis pas sur que ce soit une bonne idee (mais bon ce n'est pas ca le probleme).
Marsh Posté le 09-05-2003 à 11:37:00
Argggggggggg j'en peu plus !! J'arrive pas à recupérer ma chaine correctment !!!! ca me tronque des bouts !!!!
J'en ai marre !!!
Je met le code qui compile si kkun a le temps de m'aider !!!
Je suis sur que C pas grand chose mais la je seche !!
MERCI
Code :
|
Marsh Posté le 09-05-2003 à 11:53:44
Jardy a écrit :
|
Qu'est ce que c'est que cette horreur?
Marsh Posté le 09-05-2003 à 12:01:21
un algo bourin qui marche.... Je voi pas en quoi il est horrible..
Marsh Posté le 09-05-2003 à 12:12:16
Ah? Tu es sur que le i-- est a sa place?
De plus c'est vraiment pas une bonne idee de changer la variable d'indentation de la boucle a l'interieur de la boucle meme.
Marsh Posté le 09-05-2003 à 12:23:09
tinquite pas ya maitrise
le i-- ser jsute a revenir un arriere. ca ca marche C pas mon pb par contre si tu peu resoudre mon pb de pointeur je t'en serai fortmement reconnaissant
merci
Marsh Posté le 09-05-2003 à 12:27:47
Angel_Dooglas a écrit : Ah? Tu es sur que le i-- est a sa place? |
C'est clair. En plus, ces 2 boucles peuvent être compactées en une seule
Marsh Posté le 09-05-2003 à 12:31:47
l'heure n'est pas à l'optimisation mais au bon fonctionnement de ce code...
Marsh Posté le 09-05-2003 à 12:33:43
Jardy a écrit : l'heure n'est pas à l'optimisation mais au bon fonctionnement de ce code... |
C'est pas une question d'optimisation, c'est une question de propreté
Marsh Posté le 09-05-2003 à 12:36:12
libre a toi de penser que ta version serai plus propre.
Moi j'aime bien celle la je la comprend et elle me parai bien.
Respectons nous les uns les autres !! Je ne suis pas une grosse bete mais j'ai posté parce que G un pb d'algo pas un pb de "propreté". Merci
Marsh Posté le 09-05-2003 à 12:41:37
Jardy a écrit : libre a toi de penser que ta version serai plus propre. |
Si tu es fermé aux conseils qu'on te donne, tant pis pour toi
Ton algo est faux, remets toi un peu en question des fois...
(exemple, si string[0]==lettre, tu as i qui va être négatif au tour suivant )
Marsh Posté le 09-05-2003 à 12:46:26
je suis pas fermé au conseil mais voi tu ce n'est pas le pb qui membete le plus en ce moment. Chaque choses en son temps. Tu as sen doute raison car plus expérimenté que moi. moi le code je voi aps trop comment l'ecrite mieux. C tt. ne prend pas mal ce que je di mais je suis un peu perdu dans le cyberspace avec mes pointeurs...
merci de tes conseils ! (dsl si G paru fermé )
Marsh Posté le 09-05-2003 à 15:28:59
++Taz a écrit : remplace ton define par |
tiens je l'avais raté celle la...
et c'est quoi le but de cette manip a part d'avoir une variable en plus (une globale de preference tiens...) ?
ou alors les macros sont devenues interdites ?
la faut m'expliquer...
et en plus c'est mal const dans certains cas, genre avec un const_cast on pourrait ptet changer sa valeur (pareil avec un define mais plus difficile)
Marsh Posté le 09-05-2003 à 16:02:05
les macros ont été crées et utilisés ans ce cas pour pallier au faiblesses du langage. maintenant le langage integere la notion de pseudo-constante. tu as donc l'avantage de posséder une variable typée. ç aevite aussi les problèmes de multiples définitions des macro qui se bouffent les une les autres. le const n'est jamais jamais mal.
jusqu'ici on fait du C, donc tu gardes tes histoires de cast...
Marsh Posté le 09-05-2003 à 16:16:04
++Taz a écrit : les macros ont été crées et utilisés ans ce cas pour pallier au faiblesses du langage. maintenant le langage integere la notion de pseudo-constante. tu as donc l'avantage de posséder une variable typée. ç aevite aussi les problèmes de multiples définitions des macro qui se bouffent les une les autres. le const n'est jamais jamais mal. |
du calme du calme...
chuis d'accord pour le const, faut en mettre plein.
mais sinon pour les #define c'est pas juste une histoire de typage. deja je me vois mal remplacer tous mes #define, qui me servent dans plein de fichiers, par des globales de partout, ca ferait chelou...
tiens pour te faire plaisir voila une macro comme on en voit des douzaines :
Code :
|
Marsh Posté le 10-05-2003 à 00:35:09
Bon je suis pas sur mais je dirais que:
a chaque reallocation il faut ajouter N a ptrchaine.
Donc pour k realloc ca fait plutot ptrchaine = chaine +k*N
en plus fgets colle un \0 automatique donc c'est meme plutot
ptrchaine = chaine + k*(N-1) pour ecraser le \0.
Marsh Posté le 10-05-2003 à 10:38:05
ahhhhhhhh meci de t'interresser a mon probleme !
Je vais tester !
Marsh Posté le 10-05-2003 à 10:56:12
Tu pourais aussi gérer toi meme ta chaine avec une liste chainer sur les caractères
Marsh Posté le 10-05-2003 à 12:07:22
Citation : |
correction:
Code :
|
Marsh Posté le 10-05-2003 à 13:01:38
Bon j'ai essayé de modifier quelques trucs et ca marche tjs pas.
Si je rentre la chaine : "le petit chat est mort de froid dans la nuit noire", j'obtient "le petit est roid oire"....
AIDEZ MOI !!!!
voila le code
Code :
|
Marsh Posté le 10-05-2003 à 15:33:32
Code :
|
ça devrait mieux marcher
edit:merde, je teste pas si y'a assez de place pour le
Code :
|
enfin bref c'est à peu près ça quoi, faut fignoler un peu
A+
Marsh Posté le 10-05-2003 à 16:44:18
Je pense que c'est k*(N-1) pour placer le pointeur or tu mets capacite-1 ce qui est k*n -1 au lieu de k*n - k.
Marsh Posté le 11-05-2003 à 12:19:32
Bon, voici ma version, testée sous gcc + solaris... Ca devrait aussi passer sous windows sans problèmes:
Code :
|
La politique de réallocation de mémoire en cas de dépassement n'est pas la plus fine (x2 à chaque coup), suivant ce que tu désire fais plutôt un +=10 ou un truc dans le genre. Tiens moi au courant si cela ne marche pas.
Marsh Posté le 11-05-2003 à 12:56:18
merci à tous ! je vais conpulser un peu tout cela ! Je vous tient au courant si ca ne marche pas !!
Marsh Posté le 11-05-2003 à 12:57:25
la solution de SiliconGhost est tres compliqué et réinvente la poudre... vive fgets
Marsh Posté le 11-05-2003 à 13:09:06
oui C kler que C un peu complex et ca marche pas sous vc++, memory access violation...
T'aurais pas la soltiion ++Taz sur la version que tu ma écrite (avec fgets) mais qui marche pas...
Le prog de silicon bloque sur le realloc au 3eme passsage dans la boucle...
merci
Marsh Posté le 11-05-2003 à 13:32:29
ça devrait pas trop merder
Code :
|
j'ai pas compiler mais devrait etre bon. par contre c pas optimisé, strlen eest calculé plusieurs fois
Marsh Posté le 11-05-2003 à 13:54:13
Ooops mea culpa, j'ai fais une gaffe dans l'appel à realloc voici la version corrigée (testée sur WinXP + V Studio .NET):
Code :
|
Marsh Posté le 11-05-2003 à 14:55:58
Merci bocou a tous. J'ai retenu la solution de ++Taz qui me semble la plus élaborée...
Merci pour votre aide cela me rend bocou service !!!
+++
Marsh Posté le 13-05-2003 à 09:48:01
bon fini de jouer: pour ce qui sosnt sous systèmes GNU
>>> man getline
Marsh Posté le 08-05-2003 à 10:58:04
Salut à tous !
Je voudrai dans programme, que l'utilisateur puisse saisir une chaine de caractère aussi longue quil le veu sans avoir à définir sa taille. Les strings n'étant pas géré en C comment faire?
Je pense à un truc avec malloc &co mais je sais pas trop comment faire pour allouer juste ce quil fo (pour pas que le prog pompe trop de ressource...)
Merci à tous++