venerdì 30 dicembre 2011

Mini Tutorial C - Lesson 5

Benvenuti nell'ultima parte del Mini Tutorial C, per l'anno 2011 che ormai volge al termine. Questo post è dedicato alla Free Software Foundation e, quindi, come non inserire Richard Matthew Stallman tra le foto che ho allegato ad ogni lezione.

e co-autore del Compilatore GNU GCC ...il compilatore!)

Oggi esploreremo un altro frammento di codice ANSI C, cercando di introdurre nuovi elementi sintattici. Uno per tutti #ifdef ovvero come istruire il preprocessore nella compilazione condizionale.

Andiamo subito a vedere il codice odierno:

/* Mini Tutorial C - Lesson 5 */

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

/* another preprocessor directive */
#define DEBUG

/* global variable */
char g_string[80];

/* String Reverse function */
void str_reverse(int len, char* str)
{
    /* define local variable */
    int i;
   
    /* string walk */
    for (i=0; i<len; i++) {
        /* copy the input variable into global string */
        g_string[i] = str[len - i - 1];
        g_string[len+1] = '\0'; //ASCIIZ string terminator
    }

    return;
}

/* entry point */
int main()
{
    /* define a string buffer */
    char str_buf[80];

    /* other variable */
    int input_len = 0;

    /* output a question */
    printf("Write Your name and press ENTER\n");
   
    /* read response */   
    scanf("%s", str_buf);

#ifdef DEBUG //preprocessor in action
    printf("Your Input == %s\n", str_buf);
#endif

    input_len = strlen(str_buf);
   
#ifdef DEBUG //preprocessor in action
    printf("String Len == %d\n", input_len);
#endif

    /* reverse char order */
    str_reverse(input_len, str_buf);

    /* print result */
    printf("The reverse of Your name is: %s\n", g_string);
   
    /* terminate program */
    return 0;
} 

Compiliamo con il comando:
gcc lesson5.c -o lesson5

Eseguiamo... e cerchiamo di scoprire i limiti di questo programma.
Come sempre sta a voi modificare il codice e vedere come cambia il risultato.
E' il miglior modo per imparare!

Vediamo per passi cosa rappresenta questo programma:
  • lo scopo principale è quello di invertire il contenuto di una stringa, fornita in ingresso mediante il canale stdin (standard input). Es. Pippo => oppiP.
  • il programma è suddiviso in due funzioni: main() e str_reverse()
  • main() rappresenta il punto di entrata e uscita dal programma, è una funzione standard, mentre str_reverse() è una funzione custom, cioè il nome, i parametri di ingresso-uscita e il comportamento, li scegliete Voi che siete i programmatori.
  • nei precedenti post del Mini Tutorial, che trovate qui, abbiamo utilizzato la libreria stdio, mentre oggi includiamo anche una funzione dalla libreria string, pertanto, troverete la relativa direttiva di include.
  • la funzione della libreria string che andremo a utilizzare è la strlen() che ci dirà di quanti caratteri è costituita la nostra string ASCIIZ. Cosa significa ASCIIZ? Una stringa terminata con il carattere 0x00 ovvero '\0'. Zero, null'altro che Zero ...è un token che serve a delimitare la stringa.
  • tra le direttive del preprocessore, oggi, abbiamo utilizzato quella per la compilazione condizionale #ifdef, in pratica se la costante simbolica DEBUG è definita, quella porzione di codice verrà compilato e aggiunto al nostro programma, altrimenti no!

Qui Pianeta Terra, a presto!


Nessun commento:

Posta un commento