Unità 8 - dis.uniroma1.it · Confronto lessicografico di stringhe Una stringa sprecede una stringa...
Transcript of Unità 8 - dis.uniroma1.it · Confronto lessicografico di stringhe Una stringa sprecede una stringa...
Operazioni sulle stringheCorso di Fondamenti di InformaticaIngegneria delle Comunicazioni – BCORIngegneria Elettronica – BELR
Unità 8
Domenico Daniele Bloisi
Docenti
Parte I – prof. Silvio [email protected]@dis.uniroma1.it
http://www.dis.uniroma1.it/~salza/fondamenti.htm
Parte II – ing. Domenico Daniele Bloisi, [email protected]
http://www.dis.uniroma1.it/ ~bloisi/didattica/fondinf1112.htmlhttp://www.dis.uniroma1.it/ ~bloisi/didattica/fondinf1112.html
Nota: %7E corrisponde alla tilde ~
2011/2012Operazioni sulle stringheUnità 8
Pagina 2
Informazioni Generali
ing. Domenico Daniele Bloisi, PhD
Dipartimento di Informatica e SistemisticaVia Ariosto 25Via Ariosto 25(adiacente Piazza Dante,
A fermate Manzoni, Vittorio Emanuele,Tram 3 fermata via Labicana)
mailto:[email protected]
http://www.dis.uniroma1.it/~bloisi
2011/2012Operazioni sulle stringheUnità 8
Pagina 3
Ricevimento
Su appuntamento. Inviare una email per conferma.
DIS, via Ariosto 25DIS, via Ariosto 25II piano, stanza B211
Si consiglia di controllare la bacheca degli avvisihttp://www.dis.uniroma1.it/~bloisi/didattica/fondin f1112.html#Avvisi
2011/2012Operazioni sulle stringheUnità 8
Pagina 4
Sommario – Unità 8
• Array di caratteri: stringhe• Inizializzazione di stringhe• Lettura e scrittura di stringhe• Lettura e scrittura di stringhe• Operazioni sulle stringhe• Funzioni per la manipolazione delle stringhe: strcpy, strncpy, strcat, strncat, strcmp, strstr
• Input/Output in C
Pagina 52011/2012
• Input/Output in C• Stream• File
Operazioni sulle stringheUnità 8
Le funzioni di string.h
string.h è l’header file che contiene le definizioni di funzioni che permettono la definizioni di funzioni che permettono la manipolazione delle stringhe.
Ad esempio, è definita in string.h
size_t strlen( const char *str );
Pagina 62011/2012Operazioni sulle stringheUnità 8
che restituisce la lunghezza del parametro str .
Operazioni sulle stringhe in C
int strcmp(const char *str1, const char *str2);
Effettua un confronto lessicografico tra due Effettua un confronto lessicografico tra due stringhe restituendo un valore< 0 se str1 precede str2 ,
= 0 se str1 è uguale a str2 ,
> 0 se str1 segue str2.
Pagina 72011/2012Operazioni sulle stringheUnità 8
Confronto lessicografico di stringhe
Una stringa s precede una stringa t in ordine lessicografico se• s è un prefisso di t , oppure• s è un prefisso di t , oppure• se c e d sono il primo carattere rispettivamente di s e t in cui s e t differiscono, allora c precede d nell’ordinamento dei caratteri.
Nota: per i caratteri che sono lettere alfabetiche,
Pagina 82011/2012
l’ordinamento è quello alfabetico. Le cifre precedo no le lettere e le lettere maiuscole precedono quelle min uscole.
Operazioni sulle stringheUnità 8
Esempi
• auto precede automatico
• Automatico precede auto• Automatico precede auto
• albero precede alto
• H2Oprecede HOTEL
Pagina 92011/2012Operazioni sulle stringheUnità 8
Esercizio
Esercizio 8.2Si scriva un programma che utilizzi la Si scriva un programma che utilizzi la funzione strcmp per verificare l’ordine lessicografico mostrato negli esempi precedenti
Pagina 102011/2012Operazioni sulle stringheUnità 8
Soluzione (da completare)#include <stdio.h>#include <string.h>#include <stdlib.h>int main() {int main() {
char a[20] = "auto";char b[20] = "automatico";if(strcmp(a, b) < 0) {
printf("%s precede %s\n", a, b);}else if(strcmp(a, b) == 0) {
printf("%s uguale %s\n", a, b);}
Pagina 112011/2012
}else {
printf("%s segue %s\n", a, b);}return EXIT_SUCCESS;
} Operazioni sulle stringheUnità 8
Operazioni sulle stringhe in C
char *strcpy(char *dest, const char *src);
Copia la stringa src in dest e restituisce dest ; Copia la stringa src in dest e restituisce dest ; dest viene quindi modificata.
char *strncpy(char *dest, const char *src, size_t n);
Copia i primi n caratteri di src in dest e
Pagina 132011/2012
Copia i primi n caratteri di src in dest e restituisce destdest viene quindi modificata.
Operazioni sulle stringheUnità 8
Esempio strcpy
#include <stdio.h>#include <string.h>#include <stdlib.h>
int main() {char str1[] = "esempio";char str2[40];char str3[40];strcpy(str2, str1);strcpy(str3, "copia riuscita");
Pagina 142011/2012
strcpy(str3, "copia riuscita");printf("str1: %s\nstr2: %s\nstr3: %s\n",
str1, str2, str3);return EXIT_SUCCESS;
}Operazioni sulle stringheUnità 8
Esecuzione
str1: esempiostr2: esempiostr3: copia riuscita
Pagina 152011/2012Operazioni sulle stringheUnità 8
Attenzione
La funzione strcpy copia la stringa src nella stringa dest , incluso il carattere terminatore e la restituisce.la restituisce.
Il contenuto precedente di dest viene perduto .
Il controllo che lo spazio puntato da dest sia sufficiente rimane a carico del programmatore.
Pagina 162011/2012Operazioni sulle stringheUnità 8
sufficiente rimane a carico del programmatore.
Esempio strncpy
#include <stdio.h>#include <string.h>#include <stdlib.h>
int main() {char str1[] = "esempio";char str2[40];char str3[40];strcpy(str2, str1);strncpy(str3, "copia riuscita", 8);
Pagina 172011/2012
strncpy(str3, "copia riuscita", 8);printf("str1: %s\nstr2: %s\nstr3: %s\n",
str1, str2, str3);return EXIT_SUCCESS;
}Operazioni sulle stringheUnità 8
Esecuzione
str1: esempiostr2: esempiostr3: copia ri[d ♣♣♣♣Çstr3: copia ri[d ♣♣♣♣Ç
Perché si può ottenere questo risultato?
Pagina 182011/2012Operazioni sulle stringheUnità 8
Operazioni sulle stringhe in C
char *strcat(char *str1, const char *str2);
Concatena str2 alla fine di str1 e restituisce Concatena str2 alla fine di str1 e restituisce str1 ; str1 viene quindi modificata.
char *strncat(char *str1, const char *str2, size_t n);
Concatena i primi n caratteri di str2 alla fine di
Pagina 192011/2012
n str2str1 e restituisce str1 ; str1 viene quindi modificata.
Operazioni sulle stringheUnità 8
Esempio strcat
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <stdlib.h>
int main() {char str[80];strcpy(str, "queste ");strcat(str, "stringhe ");strcat(str, "sono ");
Pagina 202011/2012
strcat(str, "sono ");strcat(str, "concatenate.");printf("%s\n", str);return EXIT_SUCCESS;
}Operazioni sulle stringheUnità 8
Operazioni sulle stringhe in C
char *strstr(const char *str1, const char *str2);
Restituisce il puntatore alla prima occorrenza Restituisce il puntatore alla prima occorrenza della stringa str2 in str1 , oppure NULLse str2 non compare come sotto -stringa di str1 .
Pagina 222011/2012Operazioni sulle stringheUnità 8
Esempio strstr
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <stdlib.h>
int main() {char str[] = "Tutti a casa, subito!";char* pch;pch = strstr(str, "casa");if(pch != NULL)
Pagina 232011/2012
if(pch != NULL)strncpy(pch, "mare", 4);
printf("%s\n", str);return EXIT_SUCCESS;
}Operazioni sulle stringheUnità 8
Parametri passati ad un programma
La funzione main può essere dichiarata anche con un prototipo a due argomenti:
int main(int argc, char **argv)
Gli argomenti della funzione main indicano
1. un array di stringhe rappresentate mediante array di caratteri argv
2. il numero di elementi dell’array argc .
Pagina 252011/2012
Il primo argomento, cioè argv[0] , corrisponde al nome del file eseguibile.
Operazioni sulle stringheUnità 8
Esempio
#include <stdio.h>
int main(int argc, char **argv) {int main(int argc, char **argv) {int k;for (k = 0; k < argc; k++)
printf("%s ", argv[k]);printf(" \n");
}
Pagina 262011/2012
}
Operazioni sulle stringheUnità 8
Esecuzione
>gcc argomentimain.c -o argomentimain.exe
>argomentimain.exe>argomentimain.exeargomentimain.exe
>argomentimain primo secondoargomentimain primo secondo
Pagina 272011/2012Operazioni sulle stringheUnità 8
Esercizio
Esercizio 8.3Scrivere una funzione che prenda in ingresso una stringa e restituisca come valore di ritorno una stringa e restituisca come valore di ritorno il numero di vocali contenute nella stringa in ingresso
EsempioSe la stringa in ingresso è michele il valore di
Pagina 282011/2012Operazioni sulle stringheUnità 8
Se la stringa in ingresso è michele il valore di ritorno sarà 3
Soluzioneint contaVocali(const char *s){
const char *p = s;int num_vocali = 0;while (*p != ' \ 0') {while (*p != ' \ 0') {
switch(*p) {case 'a': case 'A':case 'e': case 'E':case 'i': case 'I':case 'o': case 'O':case 'u': case 'U':
num_vocali++;break;
Pagina 292011/2012Operazioni sulle stringheUnità 8
break;default: break;
} p++;
}return num_vocali;
}
Soluzione
int main() {char *p = "michele";int i = contaVocali(p);int i = contaVocali(p);printf("Vocali in %s = %d\n", p, i);return EXIT_SUCCESS;
}
Pagina 302011/2012Operazioni sulle stringheUnità 8
Esercizio Vero/falso#include <stdio.h> #include <string.h>int main(){ /*1*/ char *v="casale", s[30], *p; /*1*/ char *v="casale", s[30], *p; /*2*/ int i; /*3*/ s[0]=’n’; /*4*/ p=&v[1]; /*5*/ strcpy(s, p); /*6*/ i=strlen(s); /*7*/ printf("%s",v); /*8*/ printf("%s",s);
Dire quali tra le seguenti affermazioni sono vere:1) i vale 6; 2) i vale 5; 3) omettendo l’istruzione 3 il valore di i è casuale; 4) prima dell’istruzione 4 occorrerebbe
Pagina 322011/2012Operazioni sulle stringheUnità 8
/*8*/ printf("%s",s); /*9*/ return 0;}
4) prima dell’istruzione 4 occorrerebbe assegnare della memoria a p tramite una malloc; 5) le printf in 7 ed 8 stampano la stessa stringa; 6) p contiene un indirizzo; 7) (*v ==’c’) vale true; 8) alla fine del programma strlen(p) vale 5.
Esercizio
Esercizio 8.4Scrivere un programma inverti che preso in ingresso da linea di comando una stringa s ingresso da linea di comando una stringa s stampi a video una stringa s’ che sia l’inverso di s
Esempio>inverti Giovanni
Pagina 342011/2012Operazioni sulle stringheUnità 8
>inverti GiovanniinnavoiG
Soluzioneint main(int argc, char **argv) {
char *origin = argv[1];int l = strlen(origin+1);char *inverse = malloc(l * sizeof(char));char *inverse = malloc(l * sizeof(char));char *end_origin = origin;char *inv_ptr = inverse; while( *(end_origin + 1) != '\0' ){
end_origin++;}for( ; end_origin >= origin; end_origin--, inverse++){
*inverse = *end_origin;
Pagina 352011/2012Operazioni sulle stringheUnità 8
*inverse = *end_origin;}*inverse = '\0';printf("%s\n", inv_ptr);return EXIT_SUCCESS;
}