View Full Version : Funzione tolower() c++
Salve a tutti, volevo un aiuto su un codice che sto studiando e implementando;
trattasi del classico esempio, a titolo di semplice studio e applicazione delle tematiche da me studiate fino a questo punto, di un inventario per piccole aziende.
Il codice è molto semplice e chiaro, solo una cosa però non riesco a capire e spero di trovare qualcuno che mi aiuti:
Si tratta del menù del programma, esattamente:
do
{
cout<<"(I)mmissione\n";
cout<<"(V)isualizzazione\n";
cout<<"(A)ggiornamento\n";
cout<<"(C)ancella\n";
cout<<"(U)scita\n\n";
cout<<"Seleziona una voce: ";
cin>>ch;
}while(!strchr("ivacu",tolower(ch)));
return tolower(ch);
premetto che ho ampiamente studiato la funzione tolower(), ma non riesco a capire come riesce a funzionare in questo codice.
le mie domande sono:
1) perché se inverto la funzione con toupper() e cambio la stringa con"IVACU" non si comporta allo stesso modo logicamente invertito?
2) potete suggerirmi un utilizzo simile da poter studiare e in futuro applicare?
lorenzo001
11-06-2016, 11:27
Perché non si comporta allo stesso modo? Spiegati
Esatto, sostituendo al codice la funzione toupper() e inserendo la stringa maiuscola, il programma non funziona.
Il mio scopo è capire come la funzione tolower() in questo caso fa funzionare il programma.
Se il programma riceve un carattere maiuscolo o minuscolo, con la funzione tolower() funziona tutto, avendo la stringa in minuscolo"ivacu".
Se sostituisco la funzione con toupper() e modifico la stringa "IVACU", allora non funziona più.
lorenzo001
11-06-2016, 13:22
A me funziona regolarmente ...
Ma tu parli solo del codice del menu o del resto del programma?
vi riporto il codice ( attualmente ancora in fase di sviluppo ) così potete fare il debug assieme a me.
Il programma è di natura didattica, sono ancora alle prime armi e sto cercando di fare miei i concetti basilari.
Grazie in anticipo per l'aiuto.
/** non accetta nomi prodotti con spaziature
* bisogna controllare bene l'input da tastiera
*/
#include <iostream>
#include <ctype.h>
#include <cstring>
#include <cstdlib>
#include <cstdio>
using namespace std;
const int SIZE=2;/**< misura per test programma
*/
struct inv_type
{
char item[40];/**< nome articolo */
double cost;/**< costo articolo */
double retail;/**< prezzo al dettaglio */
int on_hand;/**< quantità disponibile */
int lead_time;/**< giorni necessari per il rifornimento */
}invtry[SIZE];/**< dichiarazione array di strutture */
void enter(), init_list(), display(), update(), input(int i), clean();
int menu();
void nessun_elemento(char *s);
int main()
{
char choice;
init_list();
for(;;)
{
choice=menu();
switch(choice)
{
case 'i' : enter();
break;
case 'v' : display();
break;
case 'a' : update();
break;
case 'c' : clean();
break;
case 'u' : return 0;
}
}
}
/**< inizializzazione array invtry */
void init_list()
{
int t;
for (t=0; t<SIZE; t++)
*invtry[t].item = '\0';
/** descrizione ciclo for:
*
* assegna il byte null '\0' a tutti i membri struttura .item dell' array di strutture invtry
*
*/
}
/**< accetta una selezione del menu */
int menu()
{
char ch;
cout<<endl;
do
{
cout<<"(I)mmissione\n";
cout<<"(V)isualizzazione\n";
cout<<"(A)ggiornamento\n";
cout<<"(C)ancella\n";
cout<<"(U)scita\n\n";
cout<<"Seleziona una voce: ";
cin>>ch;
}while(!strchr("ivacu",tolower(ch)));
return tolower(ch);
}
/**< inserire articoli nella lista */
void enter()
{
int i;
/**< trova la prima struttura libera */
for(i=0;i<SIZE;i++)
if(!*invtry[i].item)
break;
if (SIZE==i)
{
cout<<"Lista completa\n";
return;
}
input(i);
}
/**< riceve i dati in input */
void input(int i)
{
//char str[80];
/**< immissione dati */
cout<<"Articolo: ";
cin>>invtry[i].item;
cout<<"Costo: ";
cin>>invtry[i].cost;
cout<<"Prezzo al dettaglio: ";
cin>>invtry[i].retail;
cout<<"Quantita' disponibil: ";
cin>>invtry[i].on_hand;
cout<<"Tempo necessario per rifornimento: ";
cin>>invtry[i].lead_time;
}
/**< Modifica artico esistente */
void update()
{
int i;
char name[80];
cout<<"Digitare il nome dell' articolo da Aggiornare: ";
cin>>name;
for (i=0;i<SIZE;i++)
if(!strcmp(name,invtry[i].item))
break;
if(SIZE==i)
{
cout<<"Articolo non trovato\n";
return;
}
cout<<"Immettere i nuovi dati";
input(i);
}
/**< Visualizzazione della lista */
void display()
{
int t;
for(t=0;t<SIZE;t++)
{
if(*invtry[t].item)
{
cout<<invtry[t].item<<"\n";
cout<<"Costo in Euro: "<<invtry[t].cost;
cout<<"\nPrezzo al dettaglio: ";
cout<<invtry[t].retail<<endl;
cout<<"Quantita' disponibile: "<<invtry[t].on_hand;
cout<<"\nTempo di rifornimento: ";
cout<<invtry[t].lead_time<<" giorni\n\n";
}
}
nessun_elemento(invtry[0].item);
}
void clean()
{
int i;
char name[80];
if(*invtry[0].item == '\0')
nessun_elemento(invtry[0].item);/**< se la prima posizione di memoria è vuota allora richiama funzione */
else{
cout<<"Digitare il nome dell' articolo da Eliminare: ";
cin>>name;
for (i=0;i<SIZE;i++)
if(!strcmp(name,invtry[i].item))
{
(*invtry[i].item = '\0');
cout<<"Articolo Eliminato\n";
}
}
return;
}
void nessun_elemento(char *s)
{
while(!*s){
cout<<"attualmente non ci sono voci";
cout<<endl;
break;
}
}
lorenzo001
11-06-2016, 20:07
Come ti dicevo, funziona.
Facci vedere anche il codice con le modifiche.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.