Comment saisir un message sur plusieurs lignes?

Comment saisir un message sur plusieurs lignes? - C++ - Programmation

Marsh Posté le 10-11-2003 à 13:03:04    

Bonjour,
J'ai fait la fonction suivante qui permet de saisir un message sur plusieurs lignes:
 

string saisie_message()
{
 char ligne[LMAX];
 string message;
 cout<<"Message: (terminer par une ligne avec un point)"<<endl;
 while(1)
   {
   cin.getline(ligne,LMAX);
   if(strcmp(ligne,"." )!=0)
     {
    message+=ligne;
     message+="\n";
      }
   else break;
   }
 return message;
}


 
Avec cette fonction, l'utilisateur doit terminer son message un saisissant un unique point sur une ligne.
Au lieu de ça, je voudrais qu'il fasse Ctrl-D quand il a terminé. Comment faire?
 :hello:  

Reply

Marsh Posté le 10-11-2003 à 13:03:04   

Reply

Marsh Posté le 10-11-2003 à 13:35:55    

CTRL-D = 0x04 en ASCII


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 10-11-2003 à 13:39:18    

Harkonnen a écrit :

CTRL-D = 0x04 en ASCII


faut utiliser les signaux :o

Reply

Marsh Posté le 10-11-2003 à 13:42:16    

lorill a écrit :


faut utiliser les signaux :o


laisse le d'abord faire du vrai C++ au lieu d'un hybride batard (cf le strcmp() au lieu de string.compare() ), après tu lui causeras signaux :D


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 10-11-2003 à 13:43:11    

bah ligne etant un char (necessaire pour le getLine), finalement, bon, pkoi pas ?

Reply

Marsh Posté le 10-11-2003 à 13:43:12    

Harkonnen a écrit :


laisse le d'abord faire du vrai C++ au lieu d'un hybride batard (cf le strcmp() au lieu de string.compare() ), après tu lui causeras signaux :D


j'ai pas lu le code :o

Reply

Marsh Posté le 10-11-2003 à 13:44:12    

D'accord mais je ne vois pas comment faire pour que la saisie soit stoppée quand on fait Ctrl-D.

Reply

Marsh Posté le 10-11-2003 à 13:44:31    

man signal :o

Reply

Marsh Posté le 10-11-2003 à 14:12:44    

heffer a écrit :


string saisie_message()
{
 char ligne[LMAX];
 string message;
 cout<<"Message: (terminer par une ligne avec un point)"<<endl;
 while(1)
   {
   cin.getline(ligne,LMAX);
   if(strcmp(ligne,"." )!=0)
     {
    message+=ligne;
     message+="\n";
      }
   else break;
   }
 return message;
}




 
C'est quand même magnifique que la fonction retourne un(e :P) string et que dans la fonction on a un joulie magnifique char* ...


---------------
«Le succès consiste à aller d'échecs en échecs sans jamais perdre son enthousiasme» - Churchill
Reply

Marsh Posté le 10-11-2003 à 14:15:56    


Dans le mesure du possible, utiliser sigaction plutôt que signal.
 
Ceci étant, le C^d génère quel signal? Il me semblait que sous unix (et donc pas sous windows), la séquence C^d envoie un 'eof' sur l'entrée standard reliée au terminal. De quel signal s'agit-il?

Reply

Marsh Posté le 10-11-2003 à 14:15:56   

Reply

Marsh Posté le 10-11-2003 à 15:53:06    

fFluFf a écrit :


 
C'est quand même magnifique que la fonction retourne un(e :P) string et que dans la fonction on a un joulie magnifique char* ...


 
Je ne comprends pas. C'est pas correct ce que j'ai fait?

Reply

Marsh Posté le 10-11-2003 à 16:06:38    

heffer a écrit :


 
Je ne comprends pas. C'est pas correct ce que j'ai fait?


ben disons que tu mélanges un peu C et C++ dans le meme programme...


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 10-11-2003 à 16:29:19    

Harkonnen a écrit :


ben disons que tu mélanges un peu C et C++ dans le meme programme...


 
Mais la fonction getline prend un char* en paramètre donc je n'ai pas le choix. Si?

Reply

Marsh Posté le 10-11-2003 à 17:46:43    

heffer a écrit :


 
Mais la fonction getline prend un char* en paramètre donc je n'ai pas le choix. Si?


si.

Code :
  1. string in;
  2. getline(cin,in);

Reply

Marsh Posté le 10-11-2003 à 18:24:38    

sowhatin22 a écrit :


si.

Code :
  1. string in;
  2. getline(cin,in);




 
Mais fallait le dire plus tôt!  :)  
Donc est-ce que ça vous plaît mieux comme ça:

Code :
  1. string saisie_message()
  2. {
  3. string message, ligne;
  4. cout<<"Message: (terminer par une ligne avec un point)"<<endl;
  5. while(1)
  6.   {
  7.   getline(cin,ligne);
  8.   if(ligne!="." )
  9.    message+=ligne+"\n";
  10.   else break;
  11.   }
  12. return message;
  13. }


Message édité par heffer le 10-11-2003 à 18:29:10
Reply

Marsh Posté le 10-11-2003 à 18:55:13    

heffer a écrit :


 
Mais fallait le dire plus tôt!  :)  
Donc est-ce que ça vous plaît mieux comme ça:

Code :
  1. string saisie_message()
  2. {
  3. string message, ligne;
  4. cout<<"Message: (terminer par une ligne avec un point)"<<endl;
  5. while(1)
  6.   {
  7.   getline(cin,ligne);
  8.   if(ligne!="." )
  9.    message+=ligne+"\n";
  10.   else break;
  11.   }
  12. return message;
  13. }




 
ne fonctionne pas. Si tu rentre "blabla.", alors la comparaison de chaine ne fonctionne pas. Il faut faire une recherche dans la chaine.
- soit tu utilises les fonctions de recherche dans les std::string (find_first_of, notamment) pour chercher le caractère voulu. Attention alors de ne concaténer que la sous partie voulue si le caracère '.' est trouvé.
 
- soit tu utilises directement cin.get(). Dans ce cas, tu lis les caractères 1 par 1, auquel cas le test est plus facile.


Message édité par SoWhatIn22 le 10-11-2003 à 18:55:45
Reply

Marsh Posté le 10-11-2003 à 18:55:52    

ouais enfin fo lire ce qu'il veut faire aussi hein ? :O
 
"terminer par une ligne avec un point"

Reply

Marsh Posté le 10-11-2003 à 19:06:55    

chrisbk a écrit :

ouais enfin fo lire ce qu'il veut faire aussi hein ? :O
 
"terminer par une ligne avec un point"


 
Heureusement que t'es là pour me comprendre!  :jap:

Reply

Marsh Posté le 11-11-2003 à 23:59:30    

Code :
  1. #include <string>
  2. #include <vector>
  3. using namespace std;
  4. int main(){
  5. string line;
  6. vector<string> text;
  7. cout<<"entrer votre texte :\n";
  8. while(getline(cin,line)) text.push_back(line);
  9. cout<<"Texte :\n";
  10. for(int i=0;i<text.size();i++) cout<<text[i]<<endl;
  11. }


le getline dans un while permet d'arreter la saisie avec crtl-D

Reply

Sujets relatifs:

Leave a Replay

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