PDA

View Full Version : [C] Conversione MAIUSCOLO -> minuscolo


k_mishima
21-04-2007, 14:30
Salve, ho provato a convertire da MAIUSCOLO a minuscolo e viceversa un carattere tramite operatori bitwise ma il programma non va, dopo la scelta, non mi fa fare la scanf e sinceramente non capisco perchè

/*Algoritmo che converte un carattere da maiuscolo a minuscolo tramite bitwise*/
/*E il contrario*/

#include <stdio.h>

int MAtoMIN(char x);
void MINtoMA(char y,char *w);
main()
{
int scelta;
char x,z;

puts("Digita che tipo di conversione vuoi fare");
puts("[0] Da maiuscolo a minuscolo");
puts("[1] Da minuscolo a maiuscolo");
scanf("%d",&scelta);

if (scelta==0)
{
printf("Digita un carattere MAIUSCOLO: ");
scanf("%c",&x);

z=MAtoMIN(x);

printf("Carattere convertito: %d\n\n",z);
}

else if (scelta==1)
{
printf("Digita un carattere minuscolo: ");
scanf("%c",&x);

MINtoMA(x,&z);

printf("Carattere convertito: %d\n\n",z);
}
else
puts("Scelta errata");
system("pause");

}

int MAtoMIN(char x)
{
return (x|32);
}

void MINtoMA(char y,char *w)
{
*w=(y^32);
}


Qualcuno sa cosa posso aver sbagliato? Tnx ;)

MEMon
21-04-2007, 14:41
In pratica, quando usi il primo scanf e inserisci un numero poi premi INVIO, che è anch'esso un carattere e rimane nel buffer.
Il successivo scanf prende questo INVIO come carattere e quindi procede.
Puoi ovviare inserendo fflush(stdin); dopo il primo scanf.

/*Algoritmo che converte un carattere da maiuscolo a minuscolo tramite bitwise*/
/*E il contrario*/

#include <stdio.h>

int MAtoMIN(char x);
void MINtoMA(char y,char *w);
main()
{
int scelta;
char x,z;

puts("Digita che tipo di conversione vuoi fare");
puts("[0] Da maiuscolo a minuscolo");
puts("[1] Da minuscolo a maiuscolo");
scanf("%d",&scelta);
fflush(stdin);
if (scelta==0)
{
printf("Digita un carattere MAIUSCOLO: ");
scanf("%c",&x);

z=MAtoMIN(x);

printf("Carattere convertito: %c\n\n",z);
}

else if (scelta==1)
{
printf("Digita un carattere minuscolo: ");
scanf("%c",&x);

MINtoMA(x,&z);

printf("Carattere convertito: %c\n\n",z);
}
else
puts("Scelta errata");
system("pause");

}

int MAtoMIN(char x)
{
return (x|32);
}

void MINtoMA(char y,char *w)
{
*w=(y^32);
}
}

k_mishima
21-04-2007, 15:26
hai ragione, il programma ora funziona correttamente tnx:D

Ziosilvio
21-04-2007, 15:32
Puoi ovviare inserendo fflush(stdin); dopo il primo scanf.
Uno, due, tre...

... quarantacinque, quarantasei, quarattasette...

... novantotto, novantanove, CENTO! OK, sono calmo, posso parlare.
Il comportamento di fflush su uno stream di input non è definito dallo standard.
Se vuoi fare una cosa che sei sicuro che funziona, e c è l'ultimo carattere letto, fai:
x=c;
while (x!='\n')
x=getchar();
A proposito: usare una funzione grossa e complicata come scanf per leggere singoli caratteri, è come sparare alle mosche con il cannone.
Imparate a usare getchar ed fgetc.

MEMon
21-04-2007, 15:33
quindi fflush(stdin) può anche non funzionare?

k_mishima
21-04-2007, 16:36
non so io uso la scanf perchè è universale, legge tutto cambiando solo 1 lettera :D

hai altri consigli da darmi? :)