/* 
   Scrivere una funzione che legga da tastiera un array di caratteri
   di lunghezza prefissata.
   
   Successivamente, scrivere una seconda funzione che legga una
   C-stringa da tastiera finche' non viene incontrato un carattere
   bianco oppure il ritorno carrello.
   
   Scrivere anche le funzioni per la stampa a video di un array
   di caratteri e di una C-stringa.
   
 */
 
 #include <iostream>
 using namespace std;
 
 
 // DICHIARAZIONE DELLE FUNZIONI (la loro definizione si trova dopo il main)
 
 void leggiVettCar(char*, int);
 void leggiCStringa(char*);
 void stampaVettCar(char *,int);
 void stampaCStringa(char *);
 
 
 int main(){
	 
   const int LUN = 5;
   char vettCar[LUN]; // alloco spazio per un vettore di 5 caratteri
   
   const int MAX_LUN = 20;    // Dimensione logica massima per la cStringa
   char cStringa[MAX_LUN+1];  // Alloco la cStringa della dimensione fisica
                              // corrispondente alla dimensione massima (debbo riservare 1 carattere
							  // al carattere 'tappo' di fine stringa: '\0'
							  
   cout<<"Inserisci "<<LUN<<" caratteri da tastiera poi premi invio"<<endl;
   leggiVettCar(vettCar,LUN);
   cout<<"Il vettore di "<<LUN<<" caratteri inserito e': "<<endl;
   stampaVettCar(vettCar,LUN);
   
   char c;
   cin.get(c); // preleva dal buffer di ingresso il carattere inserito per ultimo
               // ossia lo '\n' (il ritorno carrello)
   
   cout<<"\nInserisci una C-stringa di "<<MAX_LUN<<" caratteri al massimo: "<<endl;
   
   // NB: le prossime due istruzioni sono perfettamente equivalenti
   leggiCStringa(cStringa);  // esercizio: commentare questa riga e scommentare
   // cin>>cStringa;         // quest'altra, per verificare che il risultato e' il medesimo
   
   cout<<"\nLa C-stringa inserita e': "<<endl;
   stampaCStringa(cStringa);
   
   // NB: anche in questo caso, invece della stampaCStringa si poteva fare una semplice cout
   cout<<"\nStampa della stessa C-Stringa mediante semplice cout: "<<endl;
   cout<<cStringa<<endl;
   
   return 0;
   
 }
 
 // DEFINIZIONE DELLE FUNZIONI
  void leggiVettCar(char*vc, int dim){
	  for (int i = 0; i < dim; i++){
		  char c;
		  cin>>c;
		  vc[i] = c;
		  // cin>>vc[i];  //NB: questa singola istruzione avrebbe potuto sostituire le tre precedenti		  
	  }	  
	  return; // per le funzioni con ritorno 'void' l'istruzione return finale puo' essere omessa
  }
  
 // la seguente funzione non crea errori semantici solo se l'utilizzatore 
 // inserisce un numero di caratteri minore della sua lunghezza logica massima preallocata,
 // prima di inserire lo spazio bianco o di premere invio
 void leggiCStringa(char* cStr){
	int i = 0;
	char c;
    do{    
	    cin.get(c);
	    cStr[i] = c;
		i++;
	}while( (c != ' ') && ( c != '\n') );

    cStr[i] = '\0'; // inserisco il 'tappo' al posto del carattere bianco o del ritorno carrello    
 }
 
 void stampaVettCar(char *vC,int dim){
     for (int i = 0; i < dim; i++)
         cout<<vC[i];		 
 }
 
 void stampaCStringa(char *cStr){
	 int i = 0;
	 while( cStr[i] != '\0'){
		 cout<<cStr[i];
         i++;
	 }	 
 }