PDA

View Full Version : [C++] Problema riconoscimento caratteri


davidedalzilio
27-08-2012, 18:49
Ciao a tutti devo fare un semplice programma che acquisisce una frase da tastiera e poi stampa le vocali presenti nella frase.
Io ho cercato di farlo così
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

int main()
{
cout << "Pogramma che trova le vocali di una frase" << endl;

int caratteri; //Numero di caratteri presenti nella stringa
char frase[caratteri];
int vocali=0;

cout<<"Scrivere una frase e premere invio";
gets(frase);

for(int i=0; i<caratteri; i++)
{
if((frase[i]=='A')||(frase[i]=='E')||(frase[i]=='I')||(frase[i]=='O')||(frase[i]=='U'))
{
cout<<frase[i]<<" ";
vocali++;
}
}

cout<<"\n\nNella frase inserita ci sono "<< vocali<< " vocali.";

return 0;
}

Il programma viene compilato ma appena lo apro mi dice che il programma ha smesso di funzionare.

Sapete dirmi come risolvere? grazie mille! :)

Gimli[2BV!2B]
27-08-2012, 19:51
Che valore ha la variabile caratteri?

airon
27-08-2012, 20:52
Oltre a quello che ti è stato giustamente fatto notare io aggiungo, spero non aumentando di troppo la complessità:

Se setti caratteri = 10;
frase[caratteri] è una stringa fissa composta appunto da max 10 caratteri

La funzione gets non fa nessun controllo sulla lunghezza della stringa immessa quindi se immetti una frase maggiore di 10 caratteri hai un errore in runtime. (un buffer overrun)
Guarda la funzione fgets() e informa l'utente sul massimo di caratteri che può inserire ad esempio.

Attento al ciclo for(). Parti da 0 e vai fino a caratteri. Se l'utente immette una frase lunga meno di caratteri accedi a dati incongruenti.
Guarda la funzione strlen().
Controlli solo le vocali maiuscole?


Buona programmazione. Ciao

bender86
28-08-2012, 08:38
Come ti hanno fatto notare non hai assegnato un valore alla variabile "caratteri". Ma se anche lo facessi non sarebbe corretto.
int caratteri = 30; // Una variabile, il suo valore è noto solo a runtime
char frase[caratteri]; // Array a lunghezza variabile, errore
Array a lunghezza variabile esistono solo in C (versione C99), in C++ no. La dimensione di un array deve essere nota durante la compilazione.
const int caratteri = 30; // Una costante, il suo valore è noto durante la compilazione
char frase[caratteri]; // Array a lunghezza fissa, ok

Per accorgerti di questi errori abilita i warning nel tuo compilatore. Se usi GCC compila con
g++ -std=c++98 -pedantic -Wall -Wextra sorgente.cpp



In C++ esiste il tipo std::string, che implementa una stringa a lunghezza variabile e automaticamente ridimensionata.

#include <iostream>

// Per il tipo std::string
#include <string>

// Per la funzione std::toupper()
#include <cctype>

int main()
{
std::cout << "Programma che trova le vocali di una frase\n";

std::string frase;
int vocali = 0;

std::cout << "Scrivere una frase e premere invio\n";
std::getline(std::cin, frase); // Legge una linea dallo standard
// input nella variabile "frase".

// "frase.size()" restituisce il numero di caratteri nella stringa.
// Cicla su tutti i caratteri della stringa.
for(int i = 0; i < frase.size(); i++)
{
// Con "frase[i]" accedi all'i-esimo carattere della stringa,
// come se fosse un array.
char c = frase[i];

// Converti il carattere in maiuscolo (se non lo è già);
c = std::toupper(c);

if((c == 'A') || (c == 'E') || (c == 'I') || (c == 'O') || (c == 'U'))
{
std::cout << frase[i] << " ";
vocali++;
}
}

std::cout << "\nNella frase inserita ci sono "<< vocali<< " vocali.\n";

return 0;
}

P.S.
Nota che non ho usato
using namespace std;
ma ho invece specificato il namespace ovunque necessario. È più chiaro che funzioni e classi che uso vengono dalla libreria standard.

P.P.S.
Se compili il mio codice con i warning attivi ti accorgerai che c'è un problema nell'intestazione del ciclo. "frase.size()" restituisce un intero senza segno (unsigned) mentre "i" è un intero con segno. A volte confrontare valori con e senza segno causa problemi, quindi potresti dichiarare "i" come "unsigned int".

tesk
28-08-2012, 09:34
la soluzione di bender è perfetta, praticamente identica a quella che avrei fatto io :)

Marco95
01-09-2012, 14:08
Guarda...io posso essere inesperto in programmazione ma questi sono errori evidentissimi...anche andando al di là della logica del programma.

Il primo errore che mi salta all'occhio è che non puoi dichiarare un array di elementi pari a una variabile (in pratica non puoi mettere la variabile dentro le parentesi quadre in fase di dichiarazione.Poi nel ciclo for non ha senso i<caratteri dato che non è iniziaizzata