Newsgroup: it.comp.lang.c++
Titolo: Problema con le stringhe

Ragazzi aiutatemi con il seguente programmino:
prova.cpp
#include <iostream.h>
#include <stdlib.h>
// programma  per provare la funzione conta.
int conta(char []);
main()
{
char frase[200];
cout <<"Inserire una frase sostituendo il carattere \"spazio\"\n con il
carattere di sottolineatura :  ";
cin >> frase;
cout <<"il numero di vocali nella frase e' "<<conta(frase)<<endl;
system("pause");
}
conta.cpp
// funzione che conta le vocali in una frase
#include <string.h>
int conta(char n[]){
int count=0;
for(int i=0;i<strlen(n);i++)
{
if(n[i]=='a'||n[i]=='e'||n[i]=='i'||n[i]=='o'||n[i]=='u'||n[i]=='A'||n[i]=='
E'||n[i]=='I'||n[i]=='O'||n[i]=='U')
count++;
}
return count; // restituisce il numero di vocali
}
Purtroppo questo programma funziona bene solo se tra una parola e un altra
viene inserito qualcosa, o non lasciando spazi , in caso contrario l'array
termina, e la funzione conta() restituisce il numero di vocali soltanto
della prima parola.
Non c'è un modo per ingannare l'array e farlo continuare a leggere senza che
si ferma appena trova lo spazio?


Se anzichè cin, utilizzi fgets definita in stdio.h così :
fgets(frase, 199, stdin);
allora dovresti risolvere il problema.
devi però stare attento perchè cout e fgets e in generale le opreazioni di
I\O in c e c++ usano schemi differenti di bufferizzazione per l'output. Una
soluzione è quella di utilizzare la funzione flush( )  dopo ogni istruzione
di output :
printf(/*....*/);
fflush(stdout);
cout << /*.....*/;
cout.flush( );
printf(/*....*/);
fflush( stdout );
cout << /*....*/;
cout.flush( );
Alcuni compilatori consentono la sincronizzazione nelle  operazioni di I\O
C, C++ chiamando ios::sync_with_stdio( ).
Non so se è anche il tuo caso.
ciao
Alberto

 si ferma appena trova lo spazio?
Mi sono dimenticato di dirti che l' array contiene effettivamente solo la
prima parola se utilizzi cin oppure scanf.
Alberto

 della prima parola.


L'idea è di ciclare sull'oprazione di lettura dell'input "cin >>" sino a
quando l'input è terminato.
Scusa eh... ma cin.get() vi fa davvero tanto schifo ? :-)
Massimo

 
Non preoccupari, ho pregiudiziali sul cin.get() :).  
Solo che cin >> mi aiuta a ignorare spazi ed invii e ad individuare le parole. Tutto qua.
A beneficio del mittente della domanda includo del codice di prova delle varie alternative (il getline mi ha dato qualche problema).
Ciao!
_______________________________________
 Luca Minudel   Consulente Informatico
 
luca.m...@nline.it
 Conegliano (TV)
 WWW    
http://www.nline.it/consulting
#include <string>
#include <iostream>
/* 
		Programma di esempio dell'input da tastiera.
		Inserire righe con sequenze di caratteri intervallati da spazi e concluse con INVIO.
		Notare l'effetto di CTRL+Z prima del'INVIO, subito dopo l'INVIO ed in mezzo ai 
		caratteri digitati.
*/
void wordInput(){
	std::cout << "Input di parole:" << std::endl << std::endl;
	std::string strIn;
	while(std::cin >> strIn)
		std::cout << "Letta la stringa: <" << strIn << ">" << std::endl;
}
void chartInput(){
	std::cout << "Input di caratteri:" << std::endl << std::endl;
	char chrIn;
	while(std::cin >> chrIn)
		std::cout << "Letto carattere: <" << chrIn << ">" << std::endl;
}
void lineInput(){
	std::cout << "Input di righe (max 80 car.):" << std::endl << std::endl;
	char achrIn[80];
	while(std::cin.getline(achrIn, 80))
		std::cout << std::endl << "Letta la riga:" << std::endl 
					 << "------------"  << std::endl 
					 << achrIn << std::endl 
					 << "------------" << std::endl << std::endl;
}
void charInputII(){
	std::cout << "Input di caratteri (II):" << std::endl << std::endl;
	char chrIn;
	while(std::cin.get(chrIn))
		std::cout << "Letto carattere: <" << chrIn << ">" << std::endl;
}
int main(){
 
	//wordInput();
	//chartInput();
	//lineInput();
	charInputII();
	return 0;
}