Come utilizzare la funzione iscntrl nella programmazione C?

Come utilizzare la funzione iscntrl nella programmazione C?

La funzione iscntrl nella programmazione C controlla se l'argomento passato è un carattere di controllo o meno. Per impostazione predefinita, "C ” locale, i caratteri di controllo sono i caratteri con i codici 0x00-0x1F e 0x7F .

È dichiarato in ctype.h e prende un argomento sotto forma di intero e restituisce il valore di tipo int. Se il carattere passato è un carattere di controllo, restituisce un numero intero diverso da zero. In caso contrario, restituisce 0.

Sintassi della funzione iscntrl in C:

//Syntax of iscntrl

int iscntrl(int c);

Parametri:

c => carattere da classificare

Valore di ritorno:

Non-zero value => Se l'argomento è un carattere di controllo (come backspace, Escape, newline, ecc.)
0 => Se l'argomento non è né un carattere di controllo.

Esempio,

Input : a
Output : Zero


Input : '\n'
Output : Non-zero value


Input : @
Output : Zero

Programma C per verificare se un carattere immesso dall'utente è un carattere di controllo o meno utilizzando iscntrl:

Vediamo un programma C per verificare che un determinato carattere sia un carattere di controllo o meno.

#include <stdio.h>
#include <ctype.h>

int main()
{
    unsigned char c = 'A';;

    int result = iscntrl(c);

    result ? printf("A is control char\n"):printf("A is not a control char\n");

    c = '@';
    result = iscntrl(c);
    result ? printf("@ is control char\n"):printf("@ is not a control char\n");

    c = '\n';
    result = iscntrl(c);
    result ? printf("\\n is control char\n"): printf("\n is not a control char\n");

    return 0;
}

Risultato:

Spiegazione:

Come sappiamo quel iscntrl() restituisce un valore diverso da zero per il carattere di controllo. Quindi, quando passiamo "A ' e '@ ‘ al iscntrl restituisce zero perché entrambi non sono caratteri di controllo. Ma quando passiamo '\n' restituisce un valore diverso da zero e stampa il messaggio che si tratta di un carattere di controllo.

Stampa il valore ASCII di tutti i caratteri di controllo:

Molti principianti e neofiti non conoscono il valore ASCII dei caratteri di controllo nella locale "C" predefinita. Quindi qui sto scrivendo un piccolo programma che ti aiuta a trovare il valore ASCII dei caratteri di controllo in decimale. Se vuoi stamparlo in esadecimale, devi cambiare gli identificatori di formato da %d a %x .

#include <stdio.h>
#include <ctype.h>

int main()
{
    int c;

    printf("Decimal ASCII value of all \
control characters are in C locale:\n\n\n");

    for (c=0; c<=127; ++c)
    {
        //iscntrl check control character
        if (iscntrl(c)!=0)
        {
            printf("%d ", c);
        }
    }
    return 0;
}

Risultato:

Decimal ASCII value of all control characters are in C locale:


0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 127

Stampa Conteggio dei caratteri di controllo nella stringa di input data:

Ci sono molte applicazioni di iscntrl nella programmazione C. Ma scoprire il conteggio dei caratteri di controllo in un dato flusso di input è molto popolare. Quindi vediamo un codice C per trovare il conteggio dei caratteri di controllo nel flusso di input specificato.

Algoritmo:

1. Attraversa la stringa data carattere per carattere e la passa alla funzione iscntrl.

2. Incrementa la variabile contatore ogni volta che incontra il carattere di controllo.

3. Interrompe il ciclo quando incontra il carattere nullo (limitazione non deve esserci un altro carattere nullo nella stringa tranne il carattere nullo di terminazione).

4. Restituisce il valore del contatore dalla funzione e stampa il valore nella funzione principale.

#include <ctype.h>
#include<string.h>
#include <stdio.h>

unsigned int findCountControlCharGivenStream(char *str)
{
    unsigned int counter = 0;
    if (str != NULL)
    {
        unsigned int i = 0;
        // counting of control char
        while (str[i] != '\0')
        {
            if (iscntrl((unsigned char)str[i]))
            {
                ++counter;
            }
            ++i;
        }
    }
    // returning total number of control char
    // present in given input stream
    return (counter);
}

int main()
{
    char str[] = "aticleworld\t.com";

    unsigned int counter = findCountControlCharGivenStream(str);

    printf("Total number of char in input stream is : %u\n\n", strlen(str));

    printf("\nNumber of control char in the "
           "given input stream is : %u\n\n", counter);

    return 0;
}

Risultato:

Total number of char in input stream is : 16

Number of control char in the given input stream is : 1

Stampa la stringa finché non incontra il primo carattere di controllo:

Un altro programma popolare è quello di stampare una stringa data fino a quando non viene incontrato il primo carattere di controllo. Con l'aiuto di iscntrl() possiamo farlo facilmente. Vediamo quindi un piccolo programma.

Algoritmo:

1. Attraversa la stringa data carattere per carattere e la passa alla funzione iscntrl.

2. Se il carattere non è un carattere di controllo, restituisce zero. Puoi vedere nelle parentesi del ciclo while, ho usato il logico Not ( ! ) con iscntrl(). Quindi per ogni carattere non di controllo verrà eseguito il ciclo e verrà stampato il carattere su stdout.

3 Quando il carattere di controllo incontrerà il ciclo while si interromperà.

#include <ctype.h>
#include<string.h>
#include <stdio.h>

int main()
{
    char str[] = "aticleworld\t.com";
    unsigned int i = 0;

    // printing till first control char
    while (!iscntrl((unsigned char)str[i]))
    {
        putchar(str[i]);
        ++i;
    }
    return 0;
}

Risultato:

aticleworld

Note: Se il valore dell'argomento (c ) non è né rappresentabile come unsigned char diverso da EOF, il comportamento di iscntrl è indefinito.

Come sappiamo il comportamento di iscntrl non è definito se il valore dell'argomento non è rappresentabile come unsigned char né è uguale a EOF. Quindi, per utilizzare queste funzioni in modo sicuro con caratteri semplici (o caratteri con segno), l'argomento deve prima essere convertito in un carattere senza segno. Perché è bene convertire un carattere con segno in un carattere senza segno prima di essere assegnato o convertito in un tipo con segno più grande.

int my_iscntrl(char ch)
{
    return iscntrl((unsigned char)ch);
}

Post consigliato:

  • Come utilizzare la funzione isalpha nella programmazione C?
  • Utilizzare la funzione isalnum nella programmazione C?
  • Come utilizzare la funzione isdigit nella programmazione C?
  • Come utilizzare l'operatore sizeof in C.
  • _Alignof o alignof Operator in C
  • Specificatori di allineamento in C ( _Alignas).
  • Specificatori di funzione in C.
  • Digita i qualificatori in C.
  • Puntatori in C.
  • Elementi del linguaggio C.
  • C String letterali con i suoi tipi
  • Identificatori C e regole di denominazione.
  • Operatore di stringa (#) in C.