Stringa (informatica): differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m r2.7.2+) (Bot: Modifico ar:سلسلة (علم الحاسوب)
m Annullata la modifica di 5.172.64.159 (discussione), riportata alla versione precedente di Simone Biancolilla
Etichetta: Rollback
 
(41 versioni intermedie di 31 utenti non mostrate)
Riga 1:
{{F|informaticaprogrammazione|maggio 2010}}
Una '''stringa''' in [[informatica]] è una sequenza di [[carattere (informatica)|caratteri]] con un ordine prestabilito. Sequenze di altri [[tipi di dato]] vengono chiamati vettori o, in inglese, [[array]].
 
== Caratteristiche ==
Può essere composta da [[byte]] nel caso delle stringhe con codifica [[ASCII]] o da [[word]] per le codifiche [[Unicode]] e [[UTF]].
 
Spesso la sequenza di dati di cui è composta una stringa viene conclusa con un carattere speciale denominato [[NULL]] (come nel [[linguaggio C]]) che serve ad indicare la fine della stringa, anche se esistono diversi metodi di rappresentazione, alcuni dei quali utilizzano un diverso terminatore oppure si appoggiano ad altri sistemi per la determinazione della lunghezza (ad esempio un dato contenente la lunghezza della stringa immagazzinato a parte).
 
In molti linguaggi di programmazione, come ad esempio [[LinguaggioJava (linguaggio di programmazione Java)|Java]] oppure [[C sharp|C#]] la stringa, per motivi di sicurezza, è un oggetto non modificabile (in [[LinguaggioJava (linguaggio di programmazione Java)|Java]] è addirittura non [[ereditarietà (informatica)|estendibile]]). Questo vuol dire che ogni qualvolta viene assegnato un nuovo valore ad una stringa (operazione di concatenazione, rimozione o aggiunta caratteri) in realtà vengono create nuove stringhe.
 
Ad esempio, in C++, l'istruzione
<sourcesyntaxhighlight lang="cpp">string a = "abc" + "def";</sourcesyntaxhighlight>
in realtà crea 4 stringhe: la stringa per rappresentare ''a'', quella per rappresentare ''"abc"'', quella per rappresentare ''"def"'' e infine quella per immagazzinare il valore temporaneo ''"abcdef"''.
Proprio per questo motivo linguaggi come [[Java (linguaggio di programmazione)|Java]] e [[C sharp|C#]] mettono a disposizione altri oggetti, come '''StringBuffer''' o '''StringBuilder''' che permettono operazioni sulle stringhe più veloci e meno onerose in termini di utilizzo della memoria.
 
== Tipo di dato "stringa" ==
Un '''tipo di dato stringa''' è un [[tipo di dato]] modellato sull'idea di una stringa formale. Le stringhe sono un tipo di dati talmente importante e utile che fanno parte di quasi tutti i [[linguaggio di programmazione|linguaggi di programmazione]]. In alcuni linguaggi sono disponibili sonosolo tipi primitivi e in altri come tipi compositi.
 
Un '''tipo di dato stringa''' è un [[tipo di dato]] modellato sull'idea di una stringa formale. Le stringhe sono un tipo di dati talmente importante e utile che fanno parte di quasi tutti i [[linguaggio di programmazione|linguaggi di programmazione]]. In alcuni linguaggi sono disponibili sono tipi primitivi e in altri come tipi compositi.
 
Mentre le stringhe formali possono avere una lunghezza arbitraria (ma finita), le stringhe dei linguaggi di programmazione hanno lunghezza limitata. In generale, ci sono due categorie di tipi di dati stringa: le ''stringhe a lunghezza fissa'', che hanno una lunghezza massima prefissata, e le ''stringhe a lunghezza variabile'', la cui lunghezza può essere modificata con apposite istruzioni. La maggior parte delle stringhe nei moderni linguaggi di programmazione sono a lunghezza variabile. Nonostante il nome, anche le stringhe a lunghezza variabile hanno un limite di lunghezza; tuttavia, in generale, il limite dipende solamente dalla quantità di memoria disponibile nel computer.
 
I tipi di dato stringa differiscono anche in base all'alfabeto su cui sono definite.
Alcune stringhe sono progettate per funzionare su un singolo alfabeto prefissato (come l'[[alfabeto latino]] o non come i caratteri rappresentabili dal codice [[ASCII]]) e altre su un alfabeto arbitrario.
Per esempio, nella libreria standard del [[C++]] le stringhe sono parametrizzate dall'alfabeto dei caratteri.
 
Riga 29:
Le implementazioni moderne usano spesso l'ampio set di caratteri definito come [[Unicode]] insieme con una varietà di complesse codifiche come l'[[UTF-8]] e l'[[UTF-16]].
 
La gran parte delle implementazioni delle stringhe somiglianosomiglia ad [[array]], i cui elementi contengono i ''codici'' corrispondenti ai caratteri nel corrispondente ''set di caratteri''. La principale differenza è che in alcune codifiche l'equivalente di un singolo carattere logico può necessitare di più elementi dell'array. Un esempio in questo senso è la codifica [[UTF-8]] in cui un singolo carattere logico può richiedere fino a quattro byte. In questi casi la lunghezza logica della stringa differisce da quella dell'array.
 
La lunghezza di una stringa può essere memorizzata implicitamente utilizzando uno speciale ''carattere di terminazione''. Questo carattere è spesso il carattere nullo (null character o NULL) avente codice zero, convenzione questa usata e perpetuata dal popolare linguaggio di programmazione [[C (linguaggio)|C]]. La lunghezza di una stringa può anche venir memorizzata esplicitamente, ad esempio attaccando alla stringa un prefisso con un valore intero, convenzione questa usata ad esempio in [[Pascal (linguaggio)|Pascal]]. Si noti che nel caso delle stringhe terminate il carattere di terminazione non sarà mai ammissibile come contenuto di una stringa.
 
Qui si ha un esempio di una stringa ''zero-terminata'' (o ''null-terminated'') memorizzata in un [[buffer]] di 10 byte, assieme alla sua rappresentazione ASCII
 
{| cellspacing="0" celpadding="2" border="1" align="center"
|- ----
| F || R || A || N || K || <small>NUL</small> || k || e
| f || w
|- ----
| 46 || 52 || 41 || 4E || 4B || 00 || 6B || 65
| 66 || 77
Riga 46 ⟶ 47:
 
La stringa equivalente in Pascal:
 
{| cellspacing="0" celpadding="2" border="1" align="center"
|- ----
| <small>length</small> || F || R || A || N
| K || k || f || f || w
|- ----
| 05 || 46 || 52 || 41 || 4E || 4B || 6B || 66
| 66 || 77
|}
 
A fianco di queste comuni rappresentazioni altre sono possibili.
 
L'utilizzo delle [[rope (informatica)|rope]] (anche dette ''heavyweight string'') può rendere certe operazioni come inserimenti, cancellazioni e concatenazioni più efficienti. [https://web.archive.org/web/20070225235739/http://www.cs.ubc.ca/local/reading/proceedings/spe91-95/spe/vol25/issue12/spe986.pdf]
 
== Algoritmi per le stringhe ==
Riga 63 ⟶ 65:
 
Questi algoritmi vengono collocati a categorie come le seguenti:
 
* [[algoritmiAlgoritmi di ricerca di stringhe]] aventi il compito di trovare una data sottostringa o una data configurazione di caratteri,
* [[algoritmiAlgoritmi di ordinamento]] (''sorting''),
* algoritmiAlgoritmi per [[espressioni regolari]],
* scansoriScansori e [[parser]] di stringhe.
 
Gli algoritmi più avanzati per l'elaborazione di stringhe spesso impiegano elaborati meccanismi formali e complesse strutture di dati: tra questi ricordiamo gli [[alberi di suffissi]] e le [[macchine a stati finiti]].
Riga 72 ⟶ 75:
== Linguaggi e programmi di utilità orientati all'elaborazione di stringhe ==
Le stringhe costituiscono un tipo di dati tanto ampiamente utilizzato da indurre lo sviluppo di numerosi linguaggi finalizzati alla facilitazione delle elaborazioni delle stringhe più richieste dalle applicazioni. Tra questi vi sono:
 
* [[awkAwk]]
* [[Icon programming language|Icon]]
* [[Perl]]
* [[Tcl]]
* [[MUMPS]]
* [[sedSed (Unix)|sedSed]]
* [[SNOBOL]]
 
Molti programmi di utilità dell'ambito [[Unix|UNIX]] effettuano manipolazioni di stringhe relativamente semplici e possono essere utilizzati per programmare [[algoritmo|algoritmi]] di elaborazione di stringhe piuttosto efficaci. Questi strumenti possono trattare come stringhe anche i file e gli ''stream'' finiti.
 
I recenti [[linguaggio di scripting|linguaggi di scripting]], come [[Perl]], [[Python]], [[Ruby (linguaggio di programmazione)|Ruby]] e [[Tcl]] si servono di [[espressione regolare|espressioni regolari]] per facilitare le manovre sui testi.
 
== StringaVoci vuotacorrelate ==
* [[Stringa (formalelinguaggi formali)]]
Con '''stringa vuota''' si intende una stringa di lunghezza nulla, cioè una stringa che non contiene nessun [[carattere (informatica)|carattere]]. Può essere considerata come l'analogo per le stringhe di ciò che lo [[zero]] è per i [[numero|numeri]].
* [[Stringa vuota]]
 
== Altri progetti ==
In genere, nei più comuni [[linguaggi di programmazione]], la stringa vuota viene indicata con la notazione:
{{interprogetto|preposizione=sulla|wikt=stringa|wikt_etichetta=stringa}}
""
 
== Collegamenti esterni ==
In C e C++, poiché le stringhe sono rappresentate come [[array]] di caratteri, si può ottenere la stringa vuota inserendo, nella prima cella dell'array, il carattere [[NULL]], il quale viene solitamente utilizzato come indicatore di fine stringa ed ha codifica 0.
* {{Collegamenti esterni}}
* {{FOLDOC|string|string}}
 
{{Controllo di autorità}}
== Voci correlate ==
[[nl:String ({{Portale|informatica)]]}}
* [[Stringa (formale)]]
 
[[Categoria:Stringhe]]
[[Categoria:TeorieTipi delladi programmazionedato]]
 
[[ar:سلسلة (علم الحاسوب)]]
[[bg:Низ]]
[[ca:Cadena (informàtica)]]
[[ckb:زنجیرەنووسە]]
[[cs:Textový řetězec]]
[[da:Tekststreng]]
[[de:Zeichenkette]]
[[el:Συμβολοσειρά]]
[[en:String (computer science)]]
[[es:Cadena de caracteres]]
[[et:Sõne (andmetüüp)]]
[[fa:رشته (علوم رایانه)]]
[[fi:Merkkijono]]
[[fr:Chaîne de caractères]]
[[he:מחרוזת (מדעי המחשב)]]
[[hu:String]]
[[id:String]]
[[is:Strengur (tölvunarfræði)]]
[[ja:文字列]]
[[ko:문자열]]
[[ms:Rentetan]]
[[nl:String (informatica)]]
[[no:Streng (informatikk)]]
[[pl:Tekstowy typ danych]]
[[pt:Cadeia de caracteres]]
[[ru:Строковый тип]]
[[sr:Ниска]]
[[sv:Sträng (data)]]
[[ta:சரம் (கணினியியல்)]]
[[uk:Рядок (програмування)]]
[[zh:字符串]]