Sign in to follow this  
zenZero

[C] lettura di lettere accentate da terminale

Recommended Posts

Oppure fai uno di quei bei casting violenti che il C permette di fare quando necessario :)

In questo caso pero' bisogna stare attenti, perche' fare (char) unsigned char rischieresti che il compilatore "perda" 1 bit.

EDIT: ho notato che anche con "Mac OS roman" l'ascii esteso va.

Share this post


Link to post
Share on other sites

allora, penso alla fine di operare in questo modo

dichiaro i miei vettori come char: in questo modo posso utilizzare tranquillamente le funzioni della libreria string.h.

il problema si ha, appunto, quando lavoro sui singoli char e mi trovo ad avere delle lettere accentate. googlando ho trovato che il casting da char ad unsigned char è permesso e non genera problemi.

quindi, quando passo alla mia funzione una lettera del mio vettore string, eseguo precedentemente il casting. in questo modo se io passo una lettera accentata come ad esempio à (che in caso fosse immagazzinata in una variabile di tipo char sarebbe con tutta probabilità un valore negativo) e la converto in unsigned char, essa assume il valore giusto della tabella ASCII estesa.

effettivamente, dopo una serie di prove, sembra che questo ragionamento sia corretto...

Share this post


Link to post
Share on other sites

quindi, quando passo alla mia funzione una lettera del mio vettore string, eseguo precedentemente il casting. in questo modo se io passo una lettera accentata come ad esempio à (che in caso fosse immagazzinata in una variabile di tipo char sarebbe con tutta probabilità un valore negativo) e la converto in unsigned char, essa assume il valore giusto della tabella ASCII estesa.

Allora, io sono anni che non programmo più attivamente, tuttavia mi pare di ricordare che un casting di per sé non cambia il contenuto di un'area di memoria, ma solo la maniera con cui viene interpretata.

In altre parole, usare un char o un unsigned char non cambia assolutamente nulla fintanto che non si vadano a fare delle operazioni che per esempio richiedano l'estensione del segno dell'operando (cosa che va fatta se il valore è signed oppure no se è unsigned), oppure usando gli operatori di ordinamento:

1111 1111 (base 2, unsigned)>0000 0000 (base 2, unsigned)

1111 1111 (base 2, signed)<0000 0000 (base 2, signed)

quindi non credo che si avrebbero problemi con le solite funzioni di copia di stringhe o ricerca di sottostringhe anche utilizzando un cast, mentre bisogna stare attenti a fare calcoli utilizzando i valori ASCII, oppure procedure di ordinamento.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this