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.
(Richard Matthew Stallman, presidente della Free Software Foundation
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;
#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 */
/* 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;
}
{
/* 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