Pourquoi gets pose t'il un problème? - C++ - Programmation
Marsh Posté le 12-05-2006 à 09:26:06
http://www.freebsd.org/doc/fr_FR.I [...] x1212.html
Marsh Posté le 12-05-2006 à 09:43:09
Ok donc si j'ai bien compris il y a dans le PC deux Registres qui permettent de savoir:1-La fonction en cours
2-Les arguments et autres variables de cette fction
3-La valeur de retour de cette fction
Et gets permets de dépasser la valeur d'une de ces piles c'est ca?Et si je poursuit le raisonnement elle permets même de passer directement à l'instruction suivante->Déduction:
Il n'y a qu'une seule Pile qui regroupe les fonctions et leurs arguments et si on depasse ,avec une fction comme gets par exemple, la quantité d'espace mémoire réservé à la variable aléatoire d'une fonction le CPU continue à lui donner de la place et saute donc une fonction dans la pile:C'est ça ou pas du tout?!!!
Marsh Posté le 12-05-2006 à 10:00:00
cette explication est trop compliquée. à gets, tu lui donnes un seul paramètre : un pointeur vers une zone mémoire ou écrire. seulement tu ne peux jamais prévoir combien gets va écrire de char, ni l'empêcher de dépasser. et quand gets dépasse, et bien c'est un comportement indéfini. ça va du plantage à la faille de sécurité.
Marsh Posté le 12-05-2006 à 10:09:23
Ok j'ai compris! Merci!Merci!
Bon alors comment est-ce-que l'on fait pour avoir une fction qui écrive un nombre défini de char et qui accepte de continuer la saisie même si il y a un espace?
Parceque cin si il y a espace hop il stoppe tout!
Marsh Posté le 12-05-2006 à 10:52:35
l'équivalent sûr de gets est fgets (à qui tu passes en paramètre le nombre maximal de caractères que tu veux lire). Mais tout ça c'est du C
En C++, tu peux utiliser des strings et la fonction getline()
Marsh Posté le 12-05-2006 à 11:26:32
Bah je suis venue, j'ai vue et je suis repartue, comment on fait pour utiliser les string?
Moi j'ai fait: string *phrase;
Et il ne voit pas ce que c'est que string, donc si quelqu'un pouvait m'expliquer,...
Marsh Posté le 12-05-2006 à 11:31:58
Code :
|
tu crois pas qu'en cherchant un peu t'aurais pu trouver ça tout seul ?
Marsh Posté le 12-05-2006 à 11:45:15
Si mais je postais plus haut et j'avais pas le temps mais bon t'as quand même raison je devrais chercher plus,...
Mais c'est vrai que je ne sais pas du tout à quoi sert les "using::std" que je vois partout et puis pourquoi est ce qu'il n'y a pas de .h apres "string"?
Marsh Posté le 12-05-2006 à 12:02:45
<string.h> est un en-tête C ; <string> est un en-tête C++.
Dans les en-têtes C++, (genre <iostream>, <string>, ...) tout est déclaré dans l'espace de nom std. Du coup en théorie tu devrais faire ça:
Code :
|
comme ça alourdit pas mal la notation, on précise en général au compilateur qu'on va utiliser un certain nombre de membres de l'espace de noms std :
Code :
|
Marsh Posté le 12-05-2006 à 14:21:49
et aussi
Code :
|
pas besoin de preciser std::getline grace à l'ADL (meme chose pour std::ostream & std::operator<< (std::ostream&, ...) )
http://en.wikipedia.org/wiki/Koenig_lookup
il est important d'utiliser la directive using uniquement quand on peut se le permettre, en general chez soit dans un source (.cpp), jamais dans un en-tete et toujours en portee minimale si possible (dans le bloc ou il est reelement necessaire)
ecrire systematiquement (sans se poser la question) ce genre de truc
Code :
|
ca revient ignorer le support des namespaces offert par le c++
Marsh Posté le 13-05-2006 à 19:14:36
franceso a écrit : l'équivalent sûr de gets est fgets (à qui tu passes en paramètre le nombre maximal de caractères que tu veux lire). Mais tout ça c'est du C |
euh... getline() existe aussi en C...
Marsh Posté le 13-05-2006 à 20:56:27
ReplyMarsh Posté le 13-05-2006 à 21:03:14
skelter a écrit : et aussi
|
Ce n'est pas obligatoire, mais est-ce souhaitable pour autant ?
(bien qu'il n'y ai pas de problème de surcharge avec l'extension GNU getline)
Marsh Posté le 12-05-2006 à 09:24:06
Je suis débutant en programmation et je voudrais savoir pourquoi est-ce-que qu'en j'utilise gets sur Linux il me dit que cela peut-être dangereux?