Il toolkit FLTK implementa un ampio insieme di classi (principalmente) e funzioni necessarie per la costruzione di interfacce grafiche ma per il resto si appoggia alle funzionalità disponibili nel linguaggio C/C++. Per esempio le stringhe che vengono spesso utilizzate come parametri nei metodi delle classi, sono definite alla maniera del C. Una stringa in C è un vettore di char e il nome rappresenta un puntatore al primo carattere e in questo modo si può trattare in modo più veloce di quanto lo si possa, per esempio, come oggetto della classe string, come nel C++, anche se dal punto di vista della facilità della scrittura del codice un oggetto della classe string permette, con i metodi che rende disponibili, elaborazioni più comode.
In questo paragrafo si tratterà della gestione delle stringhe in C in modo da avere gli strumenti per le elaborazioni più comuni che possono essere effettuate con i mezzi disponibili delle librerie C. Qualora occorressero elaborazioni che potessero essere svolte più facilmente per mezzo dei metodi della classe string del C++ si vedrà un esempio di codice per la conversione da un tipo all'altro.
Le stringhe in C sono vettori di tipo carattere la cui fine è segnalata da un carattere NULL (carattere terminatore), indicato come '\0'. Il carattere NULL è il primo codice ASCII corrispondente al valore binario 00000000 e non ha niente a che vedere con il carattere 0 che ha, in ASCII, codice binario 00110000.
char a[10];
dichiara un vettore costituito da un massimo di dieci caratteri e:
char frase[] = "Oggi non piove";
dichiara il vettore monodimensionale frase il cui numero di caratteri è determinato dalla quantità di caratteri presenti fra doppi apici più uno (il carattere NULL che chiude la stringa).
Nonostante il linguaggio C non possieda un dato di questo tipo, per il trattamento delle stringhe sono disponibili parecchie funzioni, delle quali in questa sede vengono trattate quelle che possono essere interessanti per le elaborazioni proposte.
strcpy. Questa funzione copia una stringa in un'altra. Può essere utilizzata, per esempio, per assegnare un valore a una stringa. La sua sintassi è:
strcpy(s1,s2);
Si può immaginare che tale funzione equivale, come effetto, all'assegnamento nelle variabili di altro tipo (in altri termini è come se si scrivesse: s1=s2): assegna, cioè, alla stringa s1 il valore contenuto in s2. Il secondo parametro può anche essere direttamente una stringa racchiusa tra doppi apici.
strcat e strcmp. La funzione:
strcat(s1,s2);
concatena la stringa s2 alla fine della stringa s1:
strcpy(s1,"buon"); // stringa specificata in s1 strcpy(s2,"giorno"); // lo stesso per s2 strcat(s1,s2); // s1 ora conterrà "buongiorno"
La funzione:
strcmp(s1,s2);
può essere utilizzata per effettuare comparazioni sul contenuto di due stringhe. In particolare tale funzione:
Restituisce un valore positivo se vale s1>s2
Restituisce un valore negativo se vale s1<s2
Restituisce 0 se s1 ed s2 sono uguali
Per tenere conto mnemonicamente di tali valori, basta pensare al confronto come ad una sottrazione: fra l’altro ciò non è molto distante da quello che avviene in effetti. Se da s1 si sottrae s2 si avrà un valore positivo nel caso s1>s2, negativo se s1<s2 e nullo se sono uguali
Le funzioni esaminate per il trattamento delle stringhe richiederebbero, per poter essere utilizzate, l'inclusione della libreria che le contiene (#include <cstring>) ma tale libreria è già inclusa nei file di definizione di FLTK e, quindi, si possono utilizzare, laddove servono, senza necessità di specificare l'inclusione.
Potrebbe essere utile convertire un dato da un formato ad un altro.
// conversione da char[] del C (stringa C type) // a string del C++ (stringa C++ type) char a[] = "Prova conversione in string"; string b; b.assign(a); // anche b conterrà ora la stessa stringa // conversione inversa da string a char* char s[20]; string d = "Al contrario"; strcpy(s,d.c_str()); // ora s contiene la stessa stringa // da float/double o int a char* float e=12345.12; char g[10]; int h=67; char j[10]; sprintf(g,"%4.2f",e); // g conterrà il valore float trasformato sprintf(j,”%d”,h); // j conterrà il valore int trasformato // da char* a float/double o int // normalmente richiederebbero #include <cstdlib> ma // la libreria è già inclusa nei file di definizione delle FLTK char intero[]=”123”; char puntoDec[]=”456.78”; int valI; float valF; valI = atoi(intero); // valore numerico valF = atof(puntoDec); // valore numerico
Il codice per la presenza di righe di commento esplicative non richiede ulteriori specificazioni.