Stringa in C: cos’è, arrary, funzioni di string.h ed esempi

Foto dell'autore

Andrea Barbieri

 

Home > News feed > Competenze e tecnologie > Competenze informatiche > Stringa in C: cos’è, arrary, funzioni di string.h ed esempi

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;
}

Lascia un commento