Unità 8 - dis.uniroma1.it · Confronto lessicografico di stringhe Una stringa sprecede una stringa...

35
Operazioni sulle stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni – BCOR Ingegneria Elettronica – BELR Unità 8 Domenico Daniele Bloisi

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

Esecuzione

auto precede automatico

Pagina 122011/2012Operazioni 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

Esecuzione

queste stringhe sono concatenate.

Pagina 212011/2012Operazioni 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

Esecuzione

Tutti a mare, subito!

Pagina 242011/2012Operazioni 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

Esecuzione

Vocali in michele = 3

Pagina 312011/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.

Soluzione

Sono vere le affermazioni 2 6 7 8

Pagina 332011/2012Operazioni sulle stringheUnità 8

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;

}