Al C non interessano le stringhe. Non proprio.
Li tratta come matrici di caratteri. Solo byte in memoria. Se vuoi usarli in modo efficace, hai bisogno di indicazioni. Non perché sia divertente. Ma perché senza di loro stai facendo un lavoro extra.
Una stringa in C è semplicemente “char str[100]”. Sembra spazio per 100 caratteri. Non lo è. C’è spazio per 99 caratteri più un terminatore. C utilizza stringhe con terminazione null. Ogni stringa termina con il valore ASCII 0. Scritto come '\0'.
Questo cambia tutto.
Altri linguaggi gestiscono le stringhe in modo diverso. Pascal utilizza un byte di lunghezza. Sa esattamente quanti caratteri sono memorizzati. Chiedi la lunghezza? Restituisce quel byte. Immediatamente.
C deve contare. Legge finché non raggiunge '\0'. Ciò rende C più lento in alcuni casi. Più veloce negli altri. Dipende da cosa stai facendo.
Non esiste un supporto per stringhe integrato in C. Fai affidamento sulle librerie. “ gestisce la manipolazione. Alcuni sistemi utilizzano . Devi gestire la memoria da solo. Non puoi semplicemente assegnare un array a un altro.
Questo è tutto. Copi elemento per elemento. Oppure usi strcpy. La funzione di libreria fa il lavoro pesante.
strcpy è ovunque in C. Inizializza le stringhe. Copia i dati.
Dopo l’esecuzione, s1 contiene “ciao” e s2 contiene “ciao”. L’array memorizza valori ASCII. Numeri interi. “h” è 104. “e” è 101. C pensa in byte. Pensi nel testo. Alla macchina non importa.
Il confronto utilizza strcmp. Restituisce un numero intero.
Zero significa uguale. Negativo significa che la prima stringa è inferiore. Positivo significa che è maggiore.
Esistono altre funzioni. “strlen” restituisce la lunghezza. “strcat” concatena. Leggi la pagina man se hai bisogno di più.
Ma come funzionano effettivamente queste funzioni dietro il cofano? Diamo un’occhiata a “strlen”.
Un approccio ingenuo assomiglia a questo:
La maggior parte dei programmatori C lo odiano. Sembra inefficiente. Preferiscono i puntatori.
Puoi comprimerlo ulteriormente.
Un vero esperto potrebbe probabilmente abbreviarlo.
Li ho compilati su un MicroVAX con gcc. Nessuna ottimizzazione. Eseguito ciascuno 20.000 volte su una stringa di 120 caratteri.
Prima versione: 12,3 secondi.
Seconda versione: 12,3 secondi.
Terza versione: 12,9 secondi.
I puntatori non sempre vincono.
Scrivi il codice che capisci. La leggibilità conta più di pochi microsecondi. A meno che tu non sia in un giro stretto. Quindi magari ottimizzare.
“strcpy” segue un’evoluzione simile.
Inizia con l’ovvio:
Notare “<=". Copia ‘\0’. Se lo salti, la stringa non ha fine. Lunghezza sconosciuta. Bug più tardi. Difficile da trovare.
Questa versione è inefficiente. strlen esegue ogni iterazione. Chiamalo una volta.
Ora puntatori.
Comprimilo.
Pulito. Veloce. Pericoloso se non controlli i limiti.
Ecco come funzionano le stringhe C. Nessuna magia. Solo memoria e puntatori. E un sacco di calcoli attenti.
Puntatori e prestazioni in strcpy
Tecnicamente potresti scrivere ** while (s1++ = s2++);** per gestire la copia delle stringhe. Il divario prestazionale tra le implementazioni ingenue e quelle ottimizzate è sconcertante.
Prendi strcpy. La prima versione impiega 415 secondi per copiare 10.000 volte una stringa di 120 caratteri. La seconda versione? 14,5 secondi. Il terzo scende a 9,8 secondi. Il quarto si attesta a 10,3 secondi.
Non si tratta di una differenza marginale. È una spinta enorme. I puntatori forniscono la velocità qui perché evitano un sovraccarico non necessario.
Tipi restituiti e puntatori a stringhe
Il prototipo di strcpy nella libreria di stringhe rivela il suo intento:
La maggior parte delle funzioni di stringa restituiscono un puntatore a una stringa. strcpy restituisce il valore di s1 come risultato. Ciò consente operazioni di concatenamento o l’uso immediato della stringa copiata senza una seconda ricerca.
Rimozione degli spazi iniziali senza spostare i dati
L’uso dei puntatori con le stringhe spesso comporta miglioramenti netti in termini di velocità. Puoi trarne vantaggio se ci pensi un po’.
Supponiamo di voler rimuovere gli spazi iniziali da una stringa. L’istinto è quello di spostare i caratteri, sovrascrivendo gli spazi vuoti. In C, puoi evitare del tutto il movimento.
Questo è molto più veloce della tecnica di movimento. Soprattutto per corde lunghe. Non stai spostando byte. Stai semplicemente cambiando il puntatore iniziale. I dati restano fermi. L’uscita cambia.
Imparare i trucchi
Imparerai molti altri trucchi con le corde man mano che procedi. Leggerai altro codice. Vedrai come gli altri gestiscono la memoria.
La pratica è la chiave. Non esiste una scorciatoia per leggere il codice. Devi solo guardare come è fatto e capire perché funziona. I miglioramenti in termini di prestazioni sono reali. La curva di apprendimento è ripida. Ma i risultati parlano da soli.



























