28
Il tipo stringa di caratteri
• Una stringa di caratteri è una sequenza di caratteri ASCII, atti a rappresentare una parola, una frase, un testo
• E’ un tipo strutturato costruito con l’operatore sequenza
• Una delle operazioni tipiche sulle stringhe di caratteri è la concatenazione di due o più stringhe.
Es.
A=“calcolatore “ B=“elettronico”
C=A//B=“calcolatore elettronico”
Il tipo stringa di caratteri in C
• In C una stringa di caratteri è un array monodimensionale di caratteri ASCII terminante con il carattere null ‘\0’
• Ad esempio
“Questa è una stringa”
è un array di 21 caratteri.
L’array è quindi il seguente:
elemento zero ‘Q’
primo elemento ‘u’
secondo elemento ‘e’
...
ventesimo elemento ‘a’
ventunesimo elemento ‘\0’
La dichiarazione di una variabile di tipo stringa è uguale a quella di un array monodimensionale :
30
Funzioni per la manipolazione di stringhe
• Le funzioni di manipolazione di stringhe sono : – strcat(strg1,strg2) concatenazione di stringhe – strcmp(strg1,strg2) confronto fra due stringhe – strcpy(strg1,strg2) copia di una stringa in un’altra – strlen(strg1) lunghezza di una stringa
• Dette funzioni fanno parte della libreria standard string.h
• Esistono altre funzioni di manipolazione di stringhe, ma queste sono le più usate in ambiente C.
31
Esempio
#include <stdio.h>
#include <string.h> //libreria standard contenente funzioni sul tipo stringa
main ()
{const char a[]=", Evviva";
char c[200],b[20];
printf("Immetti stringa b \n");
scanf("%s%",&b);
printf("Immetti stringa c \n");
scanf("%s%",&c);
strcat(b,c); //concatena le stringhe c e b e mette la nuova stringa in b printf("C = %s \n",b);
strcat(c,a); //concatena le stringhe c e b e mette la nuova stringa in c printf("C = %s \n",c);
}
32
/* Stampa i caratteri e la codifica ASCII */
main() {
char stringa[] = “Questa è una stringa”;
int i = 0;
while ( stringa[i] != ‘\0’ ) {
printf ( “%c = %d\n”,stringa[i], stringa[i] );
++i;
} }
Esempio
Q = 81 u = 117 e = 101 s = 115 t = 116 a = 97
= 32 . . .
g = 103 a = 97
Output del programma
Codice ASCII (in decimale)
34
… l’istruzione per l’input formattato scanf(….) non
consente di immettere spazi, ovvero legge tutti i caratteri consecutivi immessi fino al primo carattere spazio
se all’esecuzione dell’istruzione scanf("%s%",&b);
viene immessa la stringa:
CORSO DI INFORMATICA
la variabile b conterrebbe solo la stringa “CORSO”
tutti gli altri caratteri dopo lo spazio non sono considerati
… uso della funzione di input getchar()
… un approfondimento ...
35
/* Legge e stampa una stringa di max 100 caratteri*/
#include <stdio.h>
main()
{char c, linea[100];
int i ; i=0;
printf("Immetti stringa \n");
c=getchar(); /* funzione getchar() per input da tastiera, */
/* legge un solo carattere */
while ( i<100 && (c != ‘\n’)) /* ciclo per la lettura dei */
{ linea[i] = c; /* caratteri della stringa */
c=getchar(); /* nello array linea[] */
i++;
}
36
// aggiunge carattere di fine stringa linea[i++] = ‘\0’;
i = 0;
// Stampa stringa immessa printf(" Stringa Immessa \n");
while ( linea[i] != ‘\0’) { printf(“%c” , linea[i]);
i++;
} }
Definizione del problema: Calcolare l’occorrenza di ciascun carattere alfabetico minuscolo in una frase
Definizione dei dati del problema:
I: la frase, ovvero l’array che la contiene
Pi: i caratteri della frase devono essere tutti minuscoli U: per ciascun carattere minuscolo componente la frase il numero di volte che esso compare nella frase
Pu: nessuna
Esempio
38
Descrizione del metodo di elaborazione:
Si considera un array monodimensionale di nome count[] di cardinalità 26, pari al numero delle lettere minuscole: ciascun elemento dell’array corrisponde ad una lettera secondo l’ordine alfabetico (primo elemento lettera ‘a’, ultimo elemento lettera ‘z’).
Si scandisce la frase e ad ogni occorrenza di ciascun carattere minuscolo si incrementa di 1 il corrispondente elemento dell’array count[].
La corrispondenza tra i caratteri minuscoli e le posizioni dell’array è fatta sulla base del codice ASCII dei caratteri: basterà sottrarre al codice ASCII di ciascun carattere il valore 97 (codice ASCII di
‘a’).
Si stampa il contenuto di count[].
39
Esempio
Nome variabile Descrizione Tipo
frase array monomensionale di char CHAR
Nome variabile Descrizione Tipo
count array con le occorrenze di ogni carattere INT Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Nome variabile Descrizione Tipo
i, j indici INT
ch singolo carattere della frase CHAR
Tabella delle variabili di algoritmo
40
/* Calcola la frequenza dei caratteri in una frase*/
#include <stdio.h>
main()
{char ch, frase[]=“questa frase contiene molti caratteri”;
int count[26] , j,i ;
for (j=0; j<26;j++) count[j]=0; // azzera elementi di count[]
i=0;
while (frase[i]!=‘\0’)
{ if ((frase[i]>=‘a’) && (frase[i]<=‘z’) {ch=frase[i];
/* incrementa di 1 il valore dell’elemento di count corrispondente al carattere ch in frase */
count[ch - ‘a’]+ +; } i++;}
for (j=0; j<26;j++) printf(“%c %10i \n”, ‘a’+j, count[j]);
}