- 0 Discussione
-
Le Stringhe
Indice |
Introduzione
Modifica
Manipolare le stringhe in D è molto semplice e veloce, ora inizieremo a lavorare con i moduli della libreria standard Phobos, piu precisamente col modulo: std.string.
Ricordo che una stringa in D è un semplice char[], avevo detto che string era un alias, ma...cos'è un alias???
In D, alias è una parola chiave e serve per dare un sinonimo ad un tipo, proprio com'è stato fatto per string:
alias char[] string;
IMPORTANTE!!!
In D le stringe NON sono null terminating (vuol dire che a differenza del C, la fine non è segnata
con un '\0')
Dichiarare e assegnare una stringa
Modifica
Niente di più semplice, sono delle semplici variabili:
import std.stdio; int main(string[] args) { //MODO 1 string miaStringa1 = "Stringa Uno in D"; //MODO 2 char[] miaStringa2 = "Stringa Due in D"; return 0; }
Se volete utilizzare string o char[] non fa differenza sono due modi diversi per dire la stessa cosa
Operazioni con le stringhe
Modifica
In realtà c'è veramente poco da scrivere, e sorgenti si spiegano da soli.
Concatenare due stringhe
Modifica
L'operatore di concatenamento del D
Forse come avrete notato il D non usa il classico '+' per concatenare, ma bensì usa la tilde (~),
il motivo?? E' molto semplice, l'operatore '+' vuol dire somma qualcosa, e per evitare
l'ambiguità concatenamento/somma, è stata introdotta la tilde, per cui ogni volta che si vuole
contatenare array, stringhe e quant'altro è importante ricordarsi di non usare il +
L'esempio per concatenare due stringhe è molto semplice:
int main(string[] args) { string str1 = "Linguaggio "; string str2 = "di programmazione D"; string str3 = str1 ~ str2; writefln(str3); return 0; }
Output: Linguaggio di programmazione D
Splittare una stringa
Modifica
Per splittare una stringa in D esiste il metodo split(), per splittare una stringa s'intende dividere la stringa in due o più sotto-stringhe, separandola in base ad un simbolo, per rendere più chiara l'idea ecco un esempio:
import std.stdio; //Modulo principale di Phobos import std.string; //Modulo per le operazioni con le stringhe int main(string[] args) { //Dichiaro una stringa string str = "Stringa1|Stringa2"; //Splittiamo la stringa string[] splitted = std.string.split(str, "|"); //Facciamo apparire le stringhe splittate sullo schermo writefln("1) %s", splitted[0]); writefln("2) %s", splitted[1]); return 0; }
Output: 1) Stringa1 2) Stringa2
NOTA BENE
Se non si passa il token al metodo split, la funzione intende che volete splittare la stringa con
lo spazio
Trovare la prima occorrenza di una lettera
Modifica
Per trovare la prima occorrenza di una lettera si può fare in due modi:
- Cercando dall'inizio alla fine
- Cercando dalla fine all'inizio
Esistono 4 funzioni per cercare nelle stringhe:
- find(): cerca la prima occorrenza di una lettera dall'inizio verso la fine in modalità case sensitive
- ifind(): cerca la prima occorrenza di una lettera dall'inizio verso la fine in modalità NON case sensitive
- rfind(): cerca la prima occorrenza di una lettera dalla fine verso l'inizio in modalità case sensitive
- find(): cerca la prima occorrenza di una lettera dalla fine verso l'inizio in modalità NON case sensitive
import std.stdio; import std.string; int main(string[] args) { string str = "Stringa in D"; //Cerco la lettera partendo dall'inizio int index = std.string.find(str, "i"); writefln("1) %d", index); //Cerco la lettera partendo dalla fine index = std.string.rfind(str, "i"); writefln("2) %d", index); return 0; }
Output: 1) 3 2) 8
Estrarre sottoinsiemi di stringhe (substring o slicing)
Modifica
Come possiamo estrarre sottostringhe da una stringa?? E' molto semplice, ricordate che in D le stringhe non sono altro che array di caratteri???
Bene, basterà trattarli come tali:
import std.stdio; import std.string; int main(string[] args) { string str = "Stringa di prova"; int index = std.string.find(str, "p"); //Cerco la prima occorrenza della lettera 'p' string subStr = str[index..str.length]; //Ricavo il sottoinsieme (da 'p' fino alla fine) writefln(subStr); return 0; }
Output: prova
Formattare una stringa
Modifica
Per formattare una stringa in D esiste il classico metodo format():
import std.stdio; import std.string; int main(string[] args) { int num = 175; //Formattiamo la stringa string str = std.string.format("%08x", num); writefln(str); return 0; }
Output: 000000af
Stringhe null-terminating
Modifica
All'inizio del capitolo ho scritto: Il D non utilizza le stringhe null-terminating ma...se volessimo scrivere ad esempio un plugin in D per un programma, utilizzare delle API che richiedono nei parametri delle stringhe o quant'altro, come potremmo utilizzare le stringhe??? E' molto semplice, esistono 2 funzioni molto importanti:
- std.string.toString(): converte una stringa null-terminating in una stringa D (può anche convertire i numeri in stringa)
- std.string.toStringz(): converte una stringa D in una stringa null-terminating
import std.stdio; import std.string; int main(string[] args) { string str = "Stringa D"; //Convertiamo 'str' in una stringa null-terminating char* nullTermStr = std.string.toStringz(str); return 0; }