Indice dei contenuti
Cos’è una Stringa in C
Una stringa in C è un array di caratteri che termina con un carattere nullo speciale, ‘\0’. Questo carattere nullo indica la fine della stringa.
Rappresentazione delle Stringhe
Le stringhe in C sono rappresentate come array di caratteri. Ad esempio:
char str[] = "Ciao";
Input/Output di Stringhe
Per leggere e scrivere stringhe, si possono usare le funzioni printf e scanf, oppure gets e puts. Ad esempio:
char str[50]; printf("Inserisci una stringa: "); gets(str); printf("La stringa inserita è: "); puts(str);
Funzioni della Libreria <string.h>
La libreria <string.h> in C fornisce numerose funzioni per manipolare stringhe e array di caratteri.
strlen: Lunghezza di una Stringa
La funzione strlen restituisce la lunghezza di una stringa data. Ad esempio:
#include <string.h> #include <stdio.h> int main() { char str[] = "Ciao"; int len = strlen(str); printf("Lunghezza: %d\n", len); return 0; }
strcpy: Copia di una Stringa
La funzione strcpy copia la stringa sorgente nella stringa di destinazione. Ad esempio:
#include <string.h> #include <stdio.h> int main() { char src[] = "Ciao"; char dest[10]; strcpy(dest, src); printf("Destinazione: %s\n", dest); return 0; }
strcat: Concatenazione di Stringhe
La funzione strcat concatena due stringhe, aggiungendo la seconda alla fine della prima. Ad esempio:
#include <string.h> #include <stdio.h> int main() { char str1[20] = "Ciao"; char str2[] = " Mondo"; strcat(str1, str2); printf("Concatenata: %s\n", str1); return 0; }
strcmp: Confronto di Stringhe
La funzione strcmp confronta due stringhe e restituisce un valore intero che indica la relazione tra le stringhe. Ad esempio:
#include <string.h> #include <stdio.h> int main() { char str1[] = "Ciao"; char str2[] = "Mondo"; if (strcmp(str1, str2) == 0) { printf("Le stringhe sono uguali\n"); } else { printf("Le stringhe sono diverse\n"); } return 0; }
Altre Funzioni
- strncpy: Copia un numero specificato di caratteri da una stringa all’altra.
- strncat: Concatena un numero specificato di caratteri da una stringa all’altra.
- strncmp: Confronta un numero specificato di caratteri tra due stringhe.
- strstr: Trova la prima occorrenza di una sottostringa in una stringa.
- strchr: Trova la prima occorrenza di un carattere in una stringa.
- strrchr: Trova l’ultima occorrenza di un carattere in una stringa.
Esempio di un programma che utilizza varie operazioni sulle stringhe
Di seguito è riportato un esempio di un programma in C che dimostra l’uso di varie operazioni sulle stringhe.
#include <stdio.h> #include <string.h> int main() { char str1[20] = "Programmare"; char str2[20] = " in C"; char str3[40]; // Concatenazione strcpy(str3, str1); strcat(str3, str2); printf("Concatenazione: %s\n", str3); // Lunghezza printf("Lunghezza: %d\n", strlen(str3)); // Confronto if (strcmp(str1, str2) == 0) { printf("Le stringhe sono uguali\n"); } else { printf("Le stringhe sono diverse\n"); } return 0; }
Questo programma inizia con la definizione di due stringhe, str1 e str2. Successivamente, concatena queste due stringhe in str3, stampa la lunghezza di str3 e confronta str1 e str2 utilizzando la funzione strcmp.
Manipolazione di Stringhe
In C, una stringa è un array di caratteri terminato da un carattere nullo. La manipolazione di queste stringhe è un aspetto fondamentale della programmazione in C.
Scorrere una Stringa
Per scorrere una stringa, generalmente utilizziamo un ciclo for o while. Qui c’è un esempio che mostra come scorrere una stringa utilizzando un ciclo for:
#include <stdio.h> int main() { char str[] = "Ciao"; for (int i = 0; str[i] != '\0'; i++) { printf("%c ", str[i]); } return 0; }
Modificare i Caratteri di una Stringa
Modificare i caratteri di una stringa in C può essere fatto accedendo direttamente agli elementi dell’array e modificandoli. Ecco un esempio in cui convertiamo una stringa in maiuscolo:
#include <stdio.h> int main() { char str[] = "Ciao"; for (int i = 0; str[i] != '\0'; i++) { if(str[i] >= 'a' && str[i] <= 'z') { str[i] = str[i] - 'a' + 'A'; } } printf("Stringa in Maiuscolo: %s\n", str); return 0; }
Cercare Caratteri o Sottosezioni in una Stringa
Per cercare un carattere o una sottosezione in una stringa, possiamo utilizzare le funzioni strstr e strchr della libreria <string.h>. Ecco un esempio:
#include <stdio.h> #include <string.h> int main() { char str[] = "Ciao Mondo"; char sub[] = "Mondo"; char *pos = strstr(str, sub); if (pos) { printf("Sottostringa trovata in posizione: %ld\n", pos - str); } else { printf("Sottostringa non trovata\n"); } char *chPos = strchr(str, 'M'); if (chPos) { printf("Carattere trovato in posizione: %ld\n", chPos - str); } else { printf("Carattere non trovato\n"); } return 0; }
In questo esempio, strstr cerca una sottosezione all’interno di una stringa e strchr cerca la prima occorrenza di un carattere in una stringa. Entrambe le funzioni restituiscono un puntatore alla posizione, oppure NULL se la ricerca non ha esito positivo.
Stringhe e Puntatori
In C, le stringhe sono comunemente manipolate usando puntatori. Un puntatore a una stringa è un puntatore al suo primo carattere.
#include <stdio.h> int main() { char str[] = "Ciao"; char *ptr = str; while (*ptr != '\0') { printf("%c ", *ptr); ptr++; } return 0; }
In questo esempio, ptr è un puntatore al primo carattere della stringa str, e viene utilizzato per scorrere la stringa.
Overflow del Buffer
Un overflow del buffer si verifica quando scriviamo dati oltre la fine del buffer allocato. Questo è un problema comune e potenzialmente pericoloso in C.
#include <stdio.h> int main() { char buffer[10]; printf("Inserisci una stringa: "); gets(buffer); printf("Hai inserito: %s\n", buffer); return 0; }
In questo esempio, se l’utente inserisce più di 9 caratteri, si verificherà un overflow del buffer, potenzialmente sovrascrivendo altre aree di memoria.
Uso di gets()
La funzione gets() è usata per leggere una linea di testo, ma è pericolosa perché può causare overflow del buffer. E’ generalmente sconsigliata, e si preferisce usare fgets().
#include <stdio.h> int main() { char buffer[10]; printf("Inserisci una stringa: "); fgets(buffer, sizeof(buffer), stdin); printf("Hai inserito: %s\n", buffer); return 0; }
In questo esempio, usiamo fgets() al posto di gets() per evitare l’overflow del buffer.
Stringhe e Funzioni
In C, possiamo passare stringhe come argomenti a funzioni passando i loro puntatori. Ecco un esempio di una funzione che calcola la lunghezza di una stringa:
#include <stdio.h> int lengthOfString(const char *str) { int length = 0; while (*str != '\0') { length++; str++; } return length; } int main() { char str[] = "Ciao Mondo"; printf("La lunghezza della stringa è: %d\n", lengthOfString(str)); return 0; }
In questo esempio, la funzione lengthOfString accetta un puntatore a una stringa come parametro e restituisce la sua lunghezza.
Domande e risposte sulle Stringhe in C
Come si può determinare la lunghezza di una stringa in C senza usare la funzione strlen()?
Puoi determinare la lunghezza di una stringa iterando attraverso i suoi caratteri fino a raggiungere il carattere null ‘\0’, e contando il numero di iterazioni. Ecco un esempio:
#include <stdio.h> int stringLength(const char *str) { int length = 0; while (*str != '\0') { length++; str++; } return length; }
Qual è il rischio associato all’uso della funzione gets() in C?
L’uso di gets() può causare un overflow del buffer, perché non controlla la lunghezza dell’input, il che può portare a comportamenti imprevisti, errori e vulnerabilità di sicurezza.
Come si possono concatenare due stringhe in C?
In C, puoi usare la funzione strcat() della libreria <string.h> per concatenare due stringhe. Assicurati che la stringa di destinazione abbia spazio sufficiente per contenere entrambe le stringhe.
È possibile modificare il contenuto di una stringa dichiarata come array di caratteri?
Sì, è possibile modificare il contenuto di una stringa dichiarata come array di caratteri, ma non è possibile modificarne la dimensione.
Come si confrontano due stringhe in C?
Per confrontare due stringhe in C, si utilizza la funzione strcmp() della libreria <string.h>. Restituisce 0 se le stringhe sono uguali, un valore negativo se la prima stringa è minore della seconda, e un valore positivo se la prima stringa è maggiore della seconda.
Come si può copiare una stringa in un altro array di caratteri in C?
Puoi usare la funzione strcpy() della libreria <string.h> per copiare una stringa in un altro array di caratteri. È importante che l’array di destinazione sia abbastanza grande per contenere la stringa copiata.
#include <stdio.h> #include <string.h> int main() { char source[] = "Ciao"; char destination[10]; strcpy(destination, source); printf("Stringa copiata: %s\n", destination); return 0; }