Le stringhe in C

Char → occupa 1 byte.

stringhe → definite come array di caratteri. Rappresentano dei caratteri da leggersi in fila. Le stringhe NON son un tipo di dato base. Esiste la libreria #include <string.h> per accedere a una serie di funzioni.

Dichiarazione di una stringa

char stringa[] = "word";

Il carattere nullo ‘\0’ termina le stringhe. Perciò l’array stringa[] ha 5 elementi, (non 4):

Può essere dichiarata anche come

char stringa[] = {'w', 'o', 'r', 'd', '\\0'};//dobbiamo inserire il terminatore

Il carattere singolo è fra apici singoli ‘w’

La parola, sequenza di caratteri è fra apici doppi “word” (il terminatore è inserito in automatico).

char str1[32]; //str1 ha spazio per 31 caratteri (da 0 a 30) + 1 per il terminatore \\0 - (il 31 esimo elemento) 
char str2[64]; //str2 ha spazio per 64 caratteri (da 0 a 63), il 63 esimo char è \\0

Operazioni tra caratteri

c1 = 'b'; //Codice ascii di b - 8bit
c2 = 'c'; //codice ascii di c - 8 bit
c3 = c2 - c1; //Differenza tra i codici ASCII di c2 e c1
//Lo utilizziamo per capire quanti caratteri possono stare in mezzo a c2 e c1

Funzioni libreria <string.h>

  • strcpy(str1, “ciao”);str1 avrà il valore di “ciao”#include <string.h> char str1[32]; //Dichiaro l'array e riservo lo spazio in memoria, ma è vuota. char str2[64]; //Inizializza str1 con la stringa "alfa" strcpy(str1, "alfa"); //Funzione copia dalla stringa "alfa" alla str1 strcpy(str2, str1); //copio il valore di str1 in str2 ATTENZIONE → NON si può fare str1 = “alfa”, è errore
  • x = strlen(str1)conta i caratteri (tranne ‘\0’) che sono presenti nella stringa.//Se l'array è di 32 caratteri, ma ha solo 4 caratteri al suo interno, x sarà uguale a 4 x = strlen(str1); //quanti sono i caratteri presenti in str1 senza il carattere terminatore \\0
  • printf(“%s”, str1);Stampa la stringaprintf("%s", str1); //stampa tutti i caratteri finchè non compare il carattere terminatore
  • scanf(“%s”, str1);Legge la stringascanf("%s", str1); //Siccome è un array, non c'è bisogno di mettere la & Quando si fa una scan di un valore scalare si mette la &, altrimenti noEsempio
char str1[32];
char str2[64];

scanf("%s", str1); //str1 contiene ciao (messo da tastiera)

strcpy(str2, str1); //str2 riceve il valore ciao
val = strlen(str2); //val assume il valore 4 (ciao è di 4 caratteri)

printf("%s\\n", str2); //stampa ciao e va a capo

strlen(“”) ha il valore di 0. (viene contato solo il terminatore \0)

char stringa[] = "word"; //è composto da 5 caratter w o r d \\0
stringa [3]; //è un'espressione di valore 'd'

Il nome dell’array rappresenta l’indirizzo del suo primo elemento, perciò quando ci si vuole riferire all’intero array nella scanf non si mette il simbolo &

scanf("%s", stringa);

Questa scanf legge in input i caratteri fino a quando trova il carattere “blank” (spazio) o l’invio.

Lo spazio viene contato, ma possiamo inserirli solo nella dichiarazione della variabile, NON nella scanf.

Stampare una stringa con gli spazi

guys non viene stampato perchè durante l’acquisizione è stato inserito uno spazio tra “Hello” e “guys”. Dovremmo utilizzare la funzione gets() se vogliamo inserire degli spazi nell’acquisizione della stringa.

Se non ci fosse la strcopy()?

Copieremmo un carattere alla volta da s2 a s1.

char s1[N], s2[N];
/*Assegnamento di s2 omesso*/
int i = 0;
while (i<=strlen(s2) && i<N){
	s1[i] = s2[i];
	i++; 
}

NB: N è la lunghezza massima che le stringhe possono ricevere. strlen() è la lunghezza effettiva (quanti caratteri ci sono dentro alla stringa in quel momento). s1 deve essere sufficientemente grande da contenere s2.

Cosa stampano le seguenti printf?

int a = 2;
char amac[6] = "amac"; //utilizzati 4 caratteri + il tappo \\0

amac[strlen(amac)] = amac[a]; //prende il 3 carattere di amac, si conta da 0 e a vale 2
//inserisce nella posizione 4 della stringa amac, il valore a. Si avrà quindi la parola amaca\\0
printf("%s\\n", amac);  //stamperà amaca

printf("%d\\n", strlen(amac)); //sarà 5

Ogni char occupa 1 byte. 5 caratteri occupano 5 byte.

amac[strlen(amac)] = amac[a]; → prende il 3 carattere di amac, (si conta da 0 e la variabile a vale 2). Quest’istruzione, inserisce nella posizione 4 (0, 1, 2, 3, 4), quindi come quinto carattere della stringa amac, il carattere a (terzo carattere della stringa amac). Si avrà quindi la parola amaca\0 → l’array amac[6] ha dimensione 6. (posizioni da 0 a 5).

Confrontare due stringhe

  • strcmp(s1, s2)
    • Restituisce un intero
    • Confronta i codici ASCII delle due stringhe fino al ‘\0’
char s1[32], s2[64]; //Confronterà solo i 32 caratteri di s1 con i primi 32 caratteri di s2
int diverse;

diverse = strcmp(s1, s2);
if (diverse == 0)
	printf("Le stringhe sono UGUALI\n");
else if (diverse < 0)
	printf("%s PRECEDE %s", s1, s2);
else 
	printf("%s SEGUE %s", s1, s2);

Esempio comparazione

#include <stdio.h>
#include <string.h>
#define DIM 3

int main()
{
	int diverse;
	char str1[32] = "casa", str2[64] = "casona";

	diverse = strcmp(s1,s2);
}

In questo caso siccome diverse è < 0, str1 precede str2

Se non ci fosse la funzione della libreria <string.h> (strcmp), dovremmo fare come segue: