Pourquoi gets pose t'il un problème?

Pourquoi gets pose t'il un problème? - C++ - Programmation

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?

Reply

Marsh Posté le 12-05-2006 à 09:24:06   

Reply

Marsh Posté le 12-05-2006 à 09:26:06    

http://www.freebsd.org/doc/fr_FR.I [...] x1212.html


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

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

Reply

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é.

Reply

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!

Reply

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()

Reply

Marsh Posté le 12-05-2006 à 10:56:14    

Ok j'essaye  
Merci!

Reply

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,...
                 

Reply

Marsh Posté le 12-05-2006 à 11:31:58    

Code :
  1. #include <string>
  2. using std::string;


 
tu crois pas qu'en cherchant un peu t'aurais pu trouver ça tout seul ?

Reply

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

Reply

Marsh Posté le 12-05-2006 à 11:45:15   

Reply

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 :
  1. #include <iostream>
  2. #include <string>
  3. std::string s( "tutu" );
  4. std::cout << s << std::endl;

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 :
  1. #include <iostream>
  2. #include <string>
  3. using std::string;
  4. string s( "tutu" ); // pas besoin de préciser std:: grâce au "using"
  5. std::cout << s << std::endl; // std:: obligatoire car pas de "using"


Reply

Marsh Posté le 12-05-2006 à 14:21:49    

et aussi
 

Code :
  1. getline(std::cin, s); // pas besoin de std::getline


 
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 :
  1. #include <iostream>
  2. using namespace std;


 
ca revient ignorer le support des namespaces offert par le c++

Reply

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
 
En C++, tu peux utiliser des strings et la fonction getline()


euh... getline() existe aussi en C...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 13-05-2006 à 20:56:27    

Sve@r a écrit :

euh... getline() existe aussi en C...


 
Pas en C standard. C'est une extension GNU.

Reply

Marsh Posté le 13-05-2006 à 21:03:14    

skelter a écrit :

et aussi

Code :
  1. getline(std::cin, s); // pas besoin de std::getline


 
pas besoin de preciser std::getline grace à l'ADL.


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)
 
 

Reply

Marsh Posté le 13-05-2006 à 21:20:03    

oui en effet vaut mieux eviter

Reply

Sujets relatifs:

Leave a Replay

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