PDA

View Full Version : [C] Problema con confronto tra char


Chea996
12-11-2016, 17:43
Buonasera, mi sono affacciato da poco alla programmazione e stasera, tentando di scrivere un programma che mi permetta di inserire massimo 10 caratteri minuscoli, non riesco a capire come ignorare i caratteri diversi da quelli minuscoli.

Ho studiato che i caratteri minuscoli hanno tutti una codificazione ASCII consequenziale e compresa tra a e z, ma il confronto non mi funziona. :(

Il codice che ho scritto è il seguente:
#include <stdio.h>
/*Esercizio 1+2 lab03-lab04*/

#define CAPIENZA 10
#define T \0 /*Carattere speciale che fa terminare l'inserimento di caratteri nella stringa*/

int main()
{
typedef struct
{
char Lista[CAPIENZA];
}ListaSequenziale;
ListaSequenziale TipoL;

int i;
char j; /*serve per memorizzare il carattere non valido inserito*/

printf("Inserire 10 caratteri minuscoli oppure di meno seguiti da T maiuscola, tutti diversi: ");
for(i=0;i<CAPIENZA;i++)
{
scanf("%c",&TipoL.Lista[i]);

if(TipoL.Lista[i]=='T')
{
TipoL.Lista[i]='\0';
i=CAPIENZA;
}

if(TipoL.Lista[i]<'a'||TipoL.Lista[i]>'z'); /*NON FUNZIONA QUI*/
{
j=TipoL.Lista[i];

}
}

printf("%s\n",TipoL.Lista);
printf("Il carattere inserito %c non è valido ed è stato ignorato\n\n",j);

return(0);
}

Chea996
13-11-2016, 00:45
In j mi memorizza sempre l'ultimo caratte che inserisco, anche se è "giusto", e non riesco a capire come mai 😞

Guille
14-11-2016, 13:45
In j mi memorizza sempre l'ultimo caratte che inserisco, anche se è "giusto", e non riesco a capire come mai 😞

E immagino che l'istruzione printf("%s\n",TipoL.Lista); restituisce sempre tutti i caratteri digitati compreso quello che vorresti escludere vero ? :)
Oltre al consiglio di Antonio23, che dovrebbe aiutarti a trovare il motivo per cui in j finisce sempre l'ultimo carattere digitato indipendentemente se corretto o meno, ti consiglio anche di verificare attentamente se il codice che hai scritto fa esattamente tutto quello che vorresti ottenere una volta corretto l'errore: ad esempio cosa succede se vengono inseriti due caratteri non validi ? ;)

zeMMeMMez
14-11-2016, 13:54
poi ci sarebbe una certa istruzione break

sottovento
14-11-2016, 14:47
Ci sono problemi anche se l'utente inserisce 10 caratteri minuscoli, seguiti dalla T.
Ci sono problemi anche se l'utente non inserisce la T

Chea996
14-11-2016, 19:11
metti un breakpoint su quella istruzione e leggi cosa succede tramite debugger, questo è un ottimo esercizio per imparare ad usare strumenti di debug.

poi ci sarebbe una certa istruzione break

E immagino che l'istruzione printf("%s\n",TipoL.Lista); restituisce sempre tutti i caratteri digitati compreso quello che vorresti escludere vero ? :)
Oltre al consiglio di Antonio23, che dovrebbe aiutarti a trovare il motivo per cui in j finisce sempre l'ultimo carattere digitato indipendentemente se corretto o meno, ti consiglio anche di verificare attentamente se il codice che hai scritto fa esattamente tutto quello che vorresti ottenere una volta corretto l'errore: ad esempio cosa succede se vengono inseriti due caratteri non validi ? ;)

Ringrazio tutti e tre per i consigli, però l'unico strumento per sistemare un codice che mi hanno insegnato è il -Wall al momento dell'inserimento nel terminale, quindi quando parlate di breakpoint non so cosa intendiate; sapete indicarmi una guida di facile utilizzo?

In particolare Guille, sì, restituisce tutti i caratteri digitati. E non ho ancora pensato a come effettivamente ignorare i caratteri sbagliati, se sono più di uno. Pensavo di procedere a "strati" con la programmazione, nel senso che a queste cose ci avrei pensato in seguito, ma purtroppo mi sono bloccato quasi subito e quindi non sono andato avanti nella scrittura del codice.

WarDuck
15-11-2016, 18:41
Al volo, un errore visibilissimo ad occhio nudo è il seguente:


if(TipoL.Lista[i]<'a'||TipoL.Lista[i]>'z'); /*NON FUNZIONA QUI*/
{
j=TipoL.Lista[i];

}


Il punto e virgola dopo l'IF ti frega :D.