In C, le stringhe sono matrici di caratteri (char *
) e i caratteri vengono solitamente memorizzati in char
. Ho notato che alcune funzioni della libC prendono come argomento numeri interi anziché caratteri.Perché putchar, toupper, tolower, ecc. Prendono un int invece di un char?
Ad esempio, prendiamo le funzioni toupper()
e tolower()
che entrambe utilizzano int
. La pagina man dice:
Se c non è un valore unsigned char, o EOF, il comportamento di queste funzioni non è definito.
La mia ipotesi è che con un int
, toupper
e tolower
sono in grado di affrontare e unsigned char
EOF
. Ma in realtà EOF
è in pratica (c'è qualche regola sul suo valore?) Un valore che può essere memorizzato con un char
, e dal momento che quelle funzioni non trasformano EOF
in qualcos'altro, mi chiedo perché lo toupper
non prenda semplicemente un char come argomento.
In ogni caso, perché è necessario accettare qualcosa che non sia un carattere (come EOF)? Qualcuno potrebbe fornirmi un caso d'uso pertinente?
Questo è simile con fputc
o putchar
, che anche rimessa int
che viene convertito in un unsigned char
comunque.
Sto cercando le motivazioni precise per quella scelta. Voglio essere convinto, non voglio rispondere che non so se qualcuno mi chiede un giorno.
Non so alcuna regola che 'EOF' deve inserirsi in un' char', e vi posso assicurare che 'char' non è garantito per essere firmato, il che rende la vostra discussione sull'utilizzo' char' invece di 'char unsigned' sembra sbagliato. Intendi "firmato char" per tutto il tempo. –
Hai esaminato le implementazioni di queste funzioni. Penso che il parametro 'int' sia per scopi di ottimizzazione, perché la sua dimensione in byte si adatta bene alle dimensioni dei registri del processore. A sua volta, una variabile 'char' di un byte deve essere convertita in' int' dietro la tendina, e questa operazione richiede un po 'di tempo di elaborazione da elaborare. – sgnsajgon
Leggi questo: [Definizione di EOF e come utilizzarlo efficacemente] (http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?id=1043284351&answer=1048865140) –