<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-menu-disabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-os vector-feature-navigation-update-disabled vector-sticky-header-enabled skin-thumbsize-clientpref-standard" lang="it" dir="ltr"><head>
    <meta charset="UTF-8">
    <title>Ctype.h</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="icon" type="image/png" href="./_res_/favicon.png">
    <link rel="canonical" href="https://it.wikipedia.org/wiki/Ctype.h"> <link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
    <link href="./_mw_/mediawiki.skinning.content.parsoid.css" rel="stylesheet" type="text/css">
    <link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
    <link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
    <link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
    <meta name="ResourceLoaderDynamicStyles" content="">
    
    <link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
    <link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
    <link rel="stylesheet" type="text/css" href="./_res_/footer.css">
    <link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
  </head>
  <body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Ctype_h rootpage-Ctype_h skin-vector-2022 action-view">
    <div class="mw-page-container">
      <div class="mw-page-container-inner">
        <div class="mw-content-container">
          <main id="content" class="mw-body">
            <header class="mw-body-header vector-page-titlebar">
              <h1 id="firstHeading" class="firstHeading mw-first-heading">ctype.h</h1>
            </header>
            <a id="top"></a>
            <div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
              <div id="contentSub">
                <div id="mw-content-subtitle"></div>
              </div>
              <div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="it" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="it" dir="ltr" data-mw-parsoid-version="0.24.0.0-alpha15" data-mw-html-version="2.8.0"><section data-mw-section-id="0" id="mwAQ">
<span typeof="mw:Transclusion" id="mwAw"></span>
<p id="mwBA"><b id="mwBQ">ctype.h</b> è l'<a rel="mw:WikiLink" href="Header_file" title="Header file" class="mw-redirect" id="mwBg">header file</a> che, all'interno della <a rel="mw:WikiLink" href="Libreria_standard_del_C" title="Libreria standard del C" id="mwBw">libreria standard del C</a>, dichiara funzioni utilizzate per la classificazione dei caratteri.</p>

</section><section data-mw-section-id="1" id="mwCQ" aria-labelledby="Storia"><div class="mw-heading mw-heading2"><h2 id="Storia">Storia</h2></div>

<p id="mwCg">I primi programmatori in <a rel="mw:WikiLink" href="C_(linguaggio)" title="C (linguaggio)" class="mw-redirect" id="mwCw">linguaggio C</a> su <a rel="mw:WikiLink" href="Unix" title="Unix" id="mwDA">Unix</a> cominciarono rapidamente a sviluppare dei controlli per classificare i caratteri tra diversi tipi: <i id="mwDQ">numero</i>, <i id="mwDg">lettera</i>,<i id="mwDw">carattere di controllo</i>, oppure sottoinsiemi quali <i id="mwEA">lettera MAIUSCOLA</i> o <i id="mwEQ">lettera minuscola</i>, per concludere con insiemi più vasti quali <i id="mwEg">carattere stampabile</i>. Per eseguire queste classificazioni, inizialmente furono ideati dei test molto semplici; il seguente esempio mostra come identificare se il carattere contenuto nella variabile <code id="mwEw">c</code> è una lettera:</p>

<pre id="mwFA">if ('A' &lt;= c &amp;&amp; c &lt;= 'Z' || 'a' &lt;= c &amp;&amp; c &lt;= 'z')</pre>

<p id="mwFQ">Il risultato di questa espressione è valido se <code id="mwFg">c</code> rappresenta un carattere secondo la codifica <a rel="mw:WikiLink" href="ASCII" title="ASCII" id="mwFw">ASCII</a>: al contrario, non funziona se il set di caratteri usato sulla macchina è, ad esempio, <a rel="mw:WikiLink" href="EBCDIC" title="EBCDIC" id="mwGA">EBCDIC</a>. Oltre a non essere portabile, un programma basato pesantemente su test come questo sarebbe molto difficile da mantenere, data la non immediata comprensibilità del codice: questo esporrebbe il programmatore ad errori logici più o meno gravi.</p>

</section><section data-mw-section-id="2" id="mwGg" aria-labelledby="Implementazione"><div class="mw-heading mw-heading2"><h2 id="Implementazione">Implementazione</h2></div>

<p id="mwGw">A differenza di quanto riportato sopra, le funzioni di classificazione di caratteri non sono scritte in forma di test comparativi. Nella maggior parte delle librerie C, infatti, esse sono implementate con delle ricerche in tabelle <a rel="mw:WikiLink" href="Allocazione_statica_della_memoria" title="Allocazione statica della memoria" id="mwHA">allocate staticamente</a>.</p>

<p id="mwHQ">Ad esempio, la tabella può essere implementata con un <a rel="mw:WikiLink" href="Array" title="Array" id="mwHg">array</a> di 256 <a rel="mw:WikiLink" href="Numero_intero_(informatica)" title="Numero intero (informatica)" id="mwHw">interi</a> da 8 <a rel="mw:WikiLink" href="Bit" title="Bit" id="mwIA">bit</a> ciascuno, organizzati come bitfield, dove a ciascun bit corrisponde una particolare proprietà del carattere: <i id="mwIg">numero</i>, <i id="mwIw">lettera</i> e così via. Se il <a rel="mw:WikiLink" href="Bit_meno_significativo" title="Bit meno significativo" id="mwJA">bit meno significativo</a> del numero intero corrispondesse alla proprietà <i id="mwJQ">numero</i>, il codice per la funzione (o, meglio, la macro) <code id="mwJg">isdigit()</code> potrebbe essere scritto semplicemente come:</p>

<pre id="mwJw">#define isdigit(x) (TABLE[x] &amp; 1)</pre>

<p id="mwKA">Le prime versioni di <a rel="mw:WikiLink" href="Linux" title="Linux" id="mwKQ">Linux</a>, però, utilizzavano un metodo simile al seguente, che potenzialmente esponeva il codice ad errori logici:</p>

<pre id="mwKg">#define isdigit(x) ((x) &gt;= '0' &amp;&amp; (x) &lt;= '9')</pre>

<p id="mwKw">Questa definizione potrebbe causare problemi se la determinazione del valore di <code id="mwLA">x</code> avesse degli effetti collaterali, come in <code id="mwLQ">isdigit(x++)</code> oppure <code id="mwLg">isdigit(esegui_qualcosa())</code>. In questo caso l'espressione sarebbe valutata due volte, cosa non immediatamente evidente al programmatore distratto. Per questo, il metodo della tabella è utilizzato più diffusamente (vedere anche il messaggio di <a rel="mw:WikiLink" href="Linus_Torvalds" title="Linus Torvalds" id="mwLw">Linus Torvalds</a> nella <a rel="mw:WikiLink" href="Mailing_list" title="Mailing list" id="mwMA">mailing list</a> del kernel Linux, in basso alla pagina).</p>

</section><section data-mw-section-id="3" id="mwMQ" aria-labelledby="Funzioni"><div class="mw-heading mw-heading2"><h2 id="Funzioni">Funzioni</h2></div>

<p id="mwMg">Il file <code id="mwMw">ctype.h</code> contiene una dozzina di funzioni di classificazione dei caratteri: esse sono tutte dipendenti dalle impostazioni locali del sistema, tranne <code id="mwNA">isdigit()</code>. Inoltre, le funzioni possono essere divise in due sottogruppi: quelle utilizzate per la verifica delle proprietà dei caratteri e quelle per la conversione degli stessi.</p>

<table class="wikitable" id="mwNQ"> 
<tbody id="mwNg"><tr bgcolor="#e9e9e9" id="mwNw">
<th id="mwOA">Nome</th><th id="mwOQ">Descrizione</th></tr>
<tr bgcolor="#f2f2f2" id="mwOg">
<td colspan="2" align="center" id="mwOw"><span style="font-size: 120%;" id="mwPA">Funzioni per la verifica delle proprietà dei caratteri</span><br id="mwPQ">Restituiscono zero se falso o un numero diverso da zero se vero.</td></tr>
<tr id="mwPg">
<td id="mwPw"><code id="mwQA">isalnum</code></td><td id="mwQQ">Controlla che il carattere passato sia <i id="mwQg">alfanumerico</i>.</td></tr>
<tr id="mwQw">
<td id="mwRA"><code id="mwRQ">isalpha</code></td><td id="mwRg">Controlla che il carattere passato sia <i id="mwRw">alfabetico</i>.</td></tr>
<tr id="mwSA">
<td id="mwSQ"><code id="mwSg">isblank</code></td><td id="mwSw">Controlla che il carattere passato sia <i id="mwTA">bianco</i>, cioè non visibile a schermo (spazio o tabulazione). (introdotto dal C99)</td></tr>
<tr id="mwTQ">
<td id="mwTg"><code id="mwTw">iscntrl</code></td><td id="mwUA">Controlla che il carattere passato sia <i id="mwUQ">di controllo</i>.</td></tr>
<tr id="mwUg">
<td id="mwUw"><code id="mwVA">isdigit</code></td><td id="mwVQ">Controlla che il carattere passato sia <i id="mwVg">numerico</i>. (non dipendente dalle impostazioni locali)</td></tr>
<tr id="mwVw">
<td id="mwWA"><code id="mwWQ">isgraph</code></td><td id="mwWg">Controlla che il carattere passato sia <i id="mwWw">grafico</i>, cioè abbia un <a rel="mw:WikiLink" href="Glifo" title="Glifo" id="mwXA">glifo</a> ad esso associato. I caratteri di spaziatura, ad esempio, non sono considerati <i id="mwXQ">grafici</i>.</td></tr>
<tr id="mwXg">
<td id="mwXw"><code id="mwYA">islower</code></td><td id="mwYQ">Controlla che il carattere passato sia <i id="mwYg">minuscolo</i>.</td></tr>
<tr id="mwYw">
<td id="mwZA"><code id="mwZQ">isprint</code></td><td id="mwZg">Controlla che il carattere passato sia <i id="mwZw">stampabile</i>.</td></tr>
<tr id="mwaA">
<td id="mwaQ"><code id="mwag">ispunct</code></td><td id="mwaw">Controlla che il carattere passato sia <i id="mwbA">di punteggiatura</i>.</td></tr>
<tr id="mwbQ">
<td id="mwbg"><code id="mwbw">isspace</code></td><td id="mwcA">Controlla che il carattere passato sia <i id="mwcQ">di spaziatura</i>.</td></tr>
<tr id="mwcg">
<td id="mwcw"><code id="mwdA">isupper</code></td><td id="mwdQ">Controlla che il carattere passato sia <i id="mwdg">maiuscolo</i>.</td></tr>
<tr id="mwdw">
<td id="mweA"><code id="mweQ">isxdigit</code></td><td id="mweg">Controlla che il carattere passato sia <i id="mwew">esadecimale</i>, cioè sia compreso in 0-9, oppure a-f, oppure A-F.</td></tr>
<tr bgcolor="#f2f2f2" id="mwfA">
<td colspan="2" align="center" id="mwfQ"><span style="font-size: 120%;" id="mwfg">Funzioni per la conversione dei caratteri</span><br id="mwfw">Ritornano il carattere convertito.</td></tr>
<tr id="mwgA">
<td id="mwgQ"><code id="mwgg">tolower</code></td><td id="mwgw">Converte il carattere passato nel suo corrispondente minuscolo, se applicabile.</td></tr>
<tr id="mwhA">
<td id="mwhQ"><code id="mwhg">toupper</code></td><td id="mwhw">Converte il carattere passato nel suo corrispondente maiuscolo, se applicabile.</td></tr>
</tbody></table>

<p id="mwiA">La versione 3 della <a rel="mw:WikiLink" href="Single_UNIX_Specification" title="Single UNIX Specification" id="mwiQ">Single Unix Specification</a> aggiunge ulteriori funzionalità aggiuntive:</p>
<table class="wikitable" id="mwig"> 
<tbody id="mwiw"><tr bgcolor="#e9e9e9" id="mwjA">
<th id="mwjQ">Nome</th><th id="mwjg">Descrizione</th></tr>
<tr id="mwjw">
<td id="mwkA"><code id="mwkQ">isascii</code></td><td id="mwkg">Controlla che il carattere passato sia compatibile con il set di caratteri <i id="mwkw">ASCII</i>.</td></tr>
<tr id="mwlA">
<td id="mwlQ"><code id="mwlg">toascii</code></td><td id="mwlw">Converte il carattere passato affinché sia compatibile con il set di caratteri <i id="mwmA">ASCII</i>.</td></tr>
</tbody></table>

</section><section data-mw-section-id="4" id="mwmQ" aria-labelledby="Errori_comuni"><div class="mw-heading mw-heading2"><h2 id="Errori_comuni">Errori comuni</h2></div>
<p id="mwmg">Lo standard C99 afferma chiaramente (§7.4-1):</p>
<dl id="mwmw"><dd id="mwnA"><i id="mwnQ">In all cases the argument is an <b id="mwng">int</b>, the value of which shall be representable as an <b id="mwnw">unsigned char</b> or shall equal the value of the macro <b id="mwoA">EOF</b>. If the argument has any other value, the behavior is undefined.</i></dd></dl>
<p id="mwoQ">In italiano:</p>
<dl id="mwog"><dd id="mwow"><i id="mwpA">In tutti i casi [cioè tutti i parametri di funzione, ndt] gli argomenti sono degli <b id="mwpQ">int</b>, il valore dei quali deve essere rappresentabile come un <b id="mwpg">unsigned char</b> oppure deve essere equivalente al valore della macro <b id="mwpw">EOF</b>. Se l'argomento assume un qualsiasi altro valore, il comportamento è indefinito.</i></dd></dl>

<p id="mwqA">Sfortunatamente molti programmatori dimenticano che una variabile di tipo <b id="mwqQ">char</b> può essere sia con segno che senza segno, a seconda dell'implementazione. Se il tipo <b id="mwqg">char</b> è con segno, allora la conversione implicita da <b id="mwqw">char</b> a <b id="mwrA">int</b> potrebbe generare dei valori negativi, che generano un comportamento indefinito. Generalmente accade che l'argomento negativo viene usato come indice in una tabella di ricerca, accedendo ad un'area fuori dalla tabella stessa e potenzialmente fuori dalla memoria allocata dal programma, arrivando anche a poter generare un <a rel="mw:WikiLink" href="Errore_di_segmentazione" title="Errore di segmentazione" id="mwrQ">errore di segmentazione</a>.</p>

<p id="mwrg">Il modo corretto per utilizzare i parametri <b id="mwrw">char</b> è, quindi, quello di eseguire un <a rel="mw:WikiLink" href="Casting_(programmazione)" title="Casting (programmazione)" class="mw-redirect" id="mwsA">casting</a> ad <b id="mwsQ">unsigned char</b>.</p>

</section><section data-mw-section-id="5" id="mwsg" aria-labelledby="Altri_progetti"><div class="mw-heading mw-heading2"><h2 id="Altri_progetti">Altri progetti</h2></div>
<div id="interProject" style="border: 1px solid var(--border-color-base, #a2a9b1); display: none; clear: both; padding: .5em" typeof="mw:Transclusion"><p id="sisterProjects"><span>Altri progetti</span></p><ul title="Collegamenti verso gli altri progetti Wikimedia">
<li class="" title=""><a rel="mw:WikiLink/Interwiki" href="https://it.wikibooks.org/wiki/C/Appendice/Librerie%20standard" title="b:C/Appendice/Librerie standard" class="extiw external">Wikibooks</a></li></ul></div><ul><li><span typeof="mw:File"><img alt="Collabora a Wikibooks" src="./_assets_/a57f5814152f3049267aded607469870.png" decoding="async" data-file-width="300" data-file-height="300" data-file-type="drawing" height="18" width="18" class="mw-file-element" loading="lazy"></span> <a rel="mw:WikiLink/Interwiki" href="https://it.wikibooks.org/wiki/" title="b:" class="extiw external">Wikibooks</a> contiene testi o manuali su <b><a rel="mw:WikiLink/Interwiki" href="https://it.wikibooks.org/wiki/C/Appendice/Librerie%20standard" title="b:C/Appendice/Librerie standard" class="extiw external">ctype.h</a></b></li></ul>

</section><section data-mw-section-id="6" id="mwsw" aria-labelledby="Collegamenti_esterni"><div class="mw-heading mw-heading2"><h2 id="Collegamenti_esterni">Collegamenti esterni</h2></div>
<ul id="mwtA"><li id="mwtQ"><span typeof="mw:Transclusion" id="mwtg">(</span><span style="font-weight:bolder; font-size:80%"><abbr title="inglese">EN</abbr></span><span>) </span> <a rel="mw:ExtLink nofollow" href="https://groups.google.com/groups?selm=15FWF-45f-17%40gated-at.bofh.it" class="external text" id="mwtw">Spiegazione del metodo della tabella</a> da parte di <a rel="mw:WikiLink" href="Linus_Torvalds" title="Linus Torvalds" id="mwuA">Linus Torvalds</a></li></ul>



</section></div><!--htdig_noindex--><div><div class="zim-footer">
    Questa voce è stata pubblicata da <a class="external text" title="Ultima modifica il 2025-08-11" href="https://it.wikipedia.org/wiki/?title=Ctype.h&amp;oldid=146211509">Wikipedia</a>. Il testo è rilasciato in base alla licenza <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.it">Creative Commons Attribution-Share Alike 4.0</a>, salvo diversa indicazione. Potrebbero essere applicate clausole aggiuntive per i file multimediali.
</div>
</div><!--/htdig_noindex--></div>
            </div>
          </main>
        </div>
      </div>
    </div>
     <script src="./_webp_/webpHandler.js"></script>
  

</body></html>