Stringhe di caratteri

Documenti analoghi
A. Ferrari. stringhe di caratteri In linguaggio C

Stringhe. Concetti chiave

Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' a p e \0

Esercitazione di Reti degli elaboratori

Gestione delle stringhe in C

RIPRENDIAMO I PUNTATORI

C: panoramica. Violetta Lonati

STRINGHE: ARRAY DI CARATTERI! a p e \0

Lezione XI Le stringhe

Stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Strutture dati. Operatori di incremento e decremento. Strutture di dati. Strutture di dati. ++ e -- Esempi. Vettori e matrici.

Lezione 19 e Allocazione dinamica della memoria - Direttive al preprocessore - Libreria standard - Gestione delle stringhe

Linguaggio C: Stringhe Valeria Cardellini

Introduzione al linguaggio C Puntatori

Linguaggio C - Stringhe

Linguaggio C - Array. Array: tipo nome_array[num_elementi]

ELEMENTI DI INFORMATICA. Linguaggio C

Lezione 8: Stringhe ed array multidimensionali

STRINGHE: ARRAY DI CARATTERI STRINGHE: ARRAY DI CARATTERI. a p e \0

Puntatori e array. Violetta Lonati

Stringhe e allocazione dinamica della memoria

Programmazione I - Laboratorio

Stringhe. Unità 8. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

Caratteri e stringhe

Linguaggio C. Vettori, Puntatori e Funzioni Stringhe. Università degli Studi di Brescia. Prof. Massimiliano Giacomin

Esercizio 1: funzione con valore di ritorno di tipo puntatore

Introduzione al C. Unità 8 Stringhe. S. Salza, C. Ciccotelli, D. Bloisi, S. Peluso, A. Pennisi

Le stringhe. Le stringhe sono sequenze di caratteri,

Introduzione al C. Unità 8 Stringhe

Le stringhe. Le stringhe sono sequenze di caratteri,


Stringhe e tipi di dati strutturati

Esercizi. Stringhe. Stringhe Ricerca binaria

Il linguaggio C Puntatori

Gestione di stringhe. Le stringhe in C/C++



Il linguaggio C Puntatori

Tipi di dato STRUTTURATI

Introduzione al C. Lezione 4 Allocazione dinamica della memoria. Rossano Venturini. Pagina web del corso

Laboratorio di Algoritmi e Strutture Dati

Introduzione al C. Unità 8 Stringhe. D. Bloisi, S. Peluso, A. Pennisi, S. Salza

Caratteri e stringhe

Dati due punti sul piano calcolare la loro distanza

Informatica 1. Corso di Laurea Triennale in Matematica. Gianluca Rossi

Dichiarazioni e tipi predefiniti nel linguaggio C

Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata

Stringhe. Prof. Lorenzo Porcelli

Operazioni sulle stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Esercitazione 6. Array

MEMORIA DINAMICA. & Indirizzo * Contenuto. 1. Puntatori. Nozioni base sull uso dei puntatori: Operatori & * In sintesi : /* Definizine variabili */

Il blocco che costituisce il corpo di una funzione/procedura può contenere dichiarazioni di variabili. Esempio:

Aritmetica dei puntatori

Il linguaggio C Gestione della memoria

Anche se due variabili vettore sono dello stesso tipo, NON è possibile l assegnamento diretto:

ESERCIZIO: Lettura/Scrittura Array

Stringhe. Una stringa è una sequenza di caratteri. Esempi: printf( Sum = %d, s); #define ERR_PREFIX ***** Error -

Il linguaggio C. Puntatori e dintorni

Esercitazione 11. Liste semplici

Perché il linguaggio C?

Programmazione in C. La struttura del programma Variabili, espressioni, operazioni

Introduzione al linguaggio C Dati aggregati

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Stringhe. Anno Accademico 2010/2011 Francesco Tortorella

Funzioni con numero variabile di parametri: Funzioni Variadiche in C. Massimo Benerecetti Laboratorio di Algoritmi e Strutture Dati

Allocazione dinamica memoria

Ripasso R1. Dati strutturati. Esempi. Array. Dichiarazione di un array. Dichiarazione di un array in C

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. Puntatori. Marco D. Santambrogio Ver. aggiornata al 20 Aprile 2016

Esercitazione 2. Variabili e Tipi Input e Output Assegnamenti Il comando if-else

Esercizi sulle stringhe

Alcuni Richiami sul C

Programmazione I (Classe 1)

Introduzione al C. Lez. 1 Elementi. Rossano Venturini

Array. Definizione e utilizzo di vettori

ottenere la lunghezza di una stringa con la funzione strlen(stringa); Esercizio 5.1

Esercizio 1: calcolo insieme intersezione

Array. Aggragati di variabili omogenee...

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

Introduzione al C. Lez. 2 Funzioni e Puntatori

Il linguaggio C. Puntatori e dintorni

Linguaggio C - Stringhe

Esercizi. La funzione swapint() primo tentativo

Gli array. slides credit M. Poneti

Esercitazione 3 - Note

Struttura dei programmi e Variabili

Allocazione dinamica della memoria

Tipi strutturati in C. Stringhe

Uso avanzato dei puntatori Allocazione dinamica della memoria

Perché il linguaggio C?

Transcript:

Stringhe di caratteri 1

Rappresentazione Sommario Dichiarazione Indice di un carattere in una stringa Operazione su stringhe Errori comuni 2

Rappresentazione Ricorda: In memoria le celle di un array sono contigue ogni cella ha un indirizzo 0x1FFE 0x1FFF 0x2000 0x2001 0x2002 etc 3

Rappresentazione Ricorda: Nella dichiarazione una variabile è un contenitore di un valore Esempio char ch; ch = B ; 0x1FFE 0x1FFF 0x2000 0x2001 0x2002 B ch etc 4

Rappresentazione Dichiarazione di una stringa individua un array di celle ogni cella contiene un char fornisce l indirizzo della prima cella Esempio char name[5]; Specifica il numero di celle dell array 5

Rappresentazione Dichiarazione di una stringa individua un array di celle ogni cella contiene un char fornisce l indirizzo della prima cella Esempio char name[5]; name è 0x2000 0x2000 0x2004 6

Array e stringhe di caratteri Una stringa di caratteri è un array di char Una stringa di caratteri deve avere il carattere terminale ( \0 ) Il carattere terminale permette a scanf() e printf() di manipolare le stringhe efficacemente 7

Stringhe di caratteri Dichiarazione char name[5]; Dichiarazione #define MAXLENGTH 5 char name[maxlength]; name è 0x2000 0x2000 0x2004 8

Input/Output di stringhe #include <stdio.h> #define MAXLENGTH 15 Non serve &, il nome stesso individua l indirizzo int main() { char string1[maxlength]; char string2[maxlength]; scanf("%s %s", string1, string2); printf("%s %s\n", string1, string2); } return 0; 9

Dichiarazione di stringhe Dichiarazione char name[5] = Ann ; Carattere terminale \0, segna il fine-stringa name è 0x2000 0x2000 A n n \0 0x2004 10

Dichiarazione di stringhe Dichiarazione Al più 4 lettere, l ultima deve essere \0 char name[5] = Ann ; name è 0x2000 A n n \0 0x2000 0x2004 11

Dichiarazione di stringhe Dichiarazione char name[] = Ann ; Usa una cella extra per \0 name è 0x2000 0x2000 A n n \0 0x2003 12

Dichiarazione di stringhe Dichiarazione char *name = Ann ; Se si prova a modificare questa stringa, il risultato è segmentation fault 0x3000 name A n n \0 0x3000 0x3003 13

Dichiarazione di stringhe Dichiarazione char name[]; Stringa di lunghezza arbitraria? No, errore! 14

Un carattere in una stringa La dimensione di una stringa di caratteri è fissata Per raggiungere il carattere alla posizione indice, l (indice+1)-esimo carattere: string[indice] Il primo carattere ha indice 0 15

Un carattere in una stringa 0x3995 0x399C name è 0x3995 J o h n \0 indice 0 indice 4 char name[8] = John ; int i = 2; printf( Il carattere in posizione %d è %c.\n, i, name[i]); output: Il carattere in posizione 2 è h. 16

Un carattere in una stringa 0x3995 0x399C name è 0x3995 J o hx n \0 indice 2 char name[8] = John ; name[2] = X ; printf( Nome: %s\n, name); 17

Un carattere in una stringa 0x3995 0x399C name è 0x3995 J o X n \0 indice 2 char name[8] = John ; name[2] = X ; printf( Nome: %s\n, name); output: Nome: JoXn 18

Operazioni con le stringhe #include <string.h> Assegnamento: strcpy() Concatenazione: strcat() Confronto: strcmp() Lunghezza: strlen() 19

#include <stdio.h> #include <string.h> #define MAXLENGTH 100 Assegnamento int main() { char string1[maxlength]; char string2[maxlength]; strcpy(string1, Hello World! ); strcpy(string2, string1); } return 0; string1: <spazzatura> string2: <spazzatura> 20

Assegnamento #include <stdio.h> #include <string.h> #define MAXLENGTH 100 int main() { char string1[maxlength]; char string2[maxlength]; strcpy(string1, Hello World! ); strcpy(string2, string1); } return 0; string1: Hello World! string2: <spazzatura> 21

Assegnamento #include <stdio.h> #include <string.h> #define MAXLENGTH 100 int main() { char string1[maxlength]; char string2[maxlength]; strcpy(string1, Hello World! ); strcpy(string2, string1); } return 0; string1: Hello World! string2: Hello World! 22

Esempio char name1[5] = Ann ; char name2[5] = Dave ; name2 = name1; Errori Comuni Utilizzo del nome di stringa come Lvalue (variabile di tipo indirizzo) Errore! Richiesta una Lvalue-expression! - name2 contiene l indirizzo del primo valore dell array ma non è una variabile di tipo indirizzo 23

Esempio Errori Comuni Utilizzo del nome di stringa come Lvalue (variabile di tipo indirizzo) char name1[5] = Ann ; char name2[5] = Dave ; &(name2[0]) = name1; Errore! Richiesta una Lvalue-expression! - &(name2[0]) restituisce l indirizzo del primo valore dell array ma non è una variabile di tipo indirizzo 24

Attenzione Assegnamento di indirizzo Esempio char *name1 = Ann ; char *name2 = Dave ; name2 = name1; 25

Attenzione Assegnamento di indirizzo char *name1 = Ann ; char *name2 = Dave ; 0x2000 name1 A n n \0 0x2000 0x2003 0x3990 name2 D a v e \0 0x3990 0x3994 26

Attenzione Assegnamento di indirizzo name2 = name1; 0x2000 name1 A n n \0 0x2000 0x2003 0x2000 name2 D a v e \0 0x3990 0x3994 27

Concatenazione char string1[maxlength]; char string2[maxlength]; strcpy(string1, Goodbye ); strcpy(string2,, Cruel ); strcat(string1, string2); strcat(string1, string2); strcat(string1, World! ); string1: Goodbye string2:, Cruel 28

Concatenazione char string1[maxlength]; char string2[maxlength]; strcpy(string1, Goodbye ); strcpy(string2,, Cruel ); strcat(string1, string2); strcat(string1, string2); strcat(string1, World! ); string1: Goodbye, Cruel string2:, Cruel 29

Concatenazione char string1[maxlength]; char string2[maxlength]; strcpy(string1, Goodbye ); strcpy(string2,, Cruel ); strcat(string1, string2); strcat(string1, string2); strcat(string1, World! ); string1: Goodbye, Cruel, Cruel string2:, Cruel 30

Concatenazione char string1[maxlength]; char string2[maxlength]; strcpy(string1, Goodbye ); strcpy(string2,, Cruel ); strcat(string1, string2); strcat(string1, string2); strcat(string1, World! ); string1: Goodbye, Cruel, Cruel World! string2:, Cruel 31

Errori Comuni Spazio insufficente char name[] = Ann ; strcpy(name, David ); name è 0x2000 A n n \0 0x2000 0x2003 32

Errori Comuni Spazio insufficente char name[] = Ann ; strcpy(name, David ); name è 0x2000 D a v i d \0 0x2000 0x2003 33

Errore tipico Spazio insufficente char name[5]; strcpy(name, David ); Non dimenticare il carattere \0 name è 0x3990 D a v i d \0 0x3990 0x3994 34

Errori Comuni Spazio insufficente char name[5]; strcpy(name, Ann ); strcat(name, Smith ); name è 0x2000 A n n \0 0x2000 0x2004 35

Errori Comuni Spazio insufficente char name[5]; Ma in pratica? Vediamo cosa succede.. strcpy(name, Ann ); strcat(name, Smith ); name è 0x2000 A n n S m i t h \0 0x2000 0x2004 36

Esempio: strassign.c #include <stdio.h> #include <string.h> #define MAXLENGTH 5 int main() { char name1[maxlength] = Ann ; char name2[] = Ann ; char *name3 = John ; char name4[maxlength]; } PRIMA name1=ann name2=ann name3=john printf( \nprima\nname1=%s\nname2=%s\nname3=%s, name1, name2, name3); strcpy(name1, Fred ); strcpy(name2, Fred ); strcpy(name4,name1); name3 = name2; printf( \ndopo\nname1=%s\nname2=%s\nname3=%s\nname4=%s, name1, name2, name3, name4); strcat(name1, Lee ); strcpy(name2, Jim ); printf( \ninfine\nname1=%s\nname2=%s\nname3=%s\nname4=%s, name1, name2, name3, name4); return 0; 37

Esempio: strassign.c #include <stdio.h> #include <string.h> #define MAXLENGTH 5 int main() { char name1[maxlength] = Ann ; char name2[] = Ann ; char *name3 = John ; char name4[maxlength]; } DOPO name1=fred name2=fred name3=fred name4=fred printf( \nprima\nname1=%s\nname2=%s\nname3=%s, name1, name2, name3); strcpy(name1, Fred ); strcpy(name2, Fred ); strcpy(name4,name1); name3 = name2; printf( \ndopo\nname1=%s\nname2=%s\nname3=%s\nname4=%s, name1, name2, name3, name4); strcat(name1, Lee ); strcpy(name2, Jim ); printf( \ninfine\nname1=%s\nname2=%s\nname3=%s\nname4=%s, name1, name2, name3, name4); return 0; 38

Esempio: strassign.c #include <stdio.h> #include <string.h> #define MAXLENGTH 5 int main() { char name1[maxlength] = Ann ; char name2[] = Ann ; char *name3 = John ; char name4[maxlength]; } INFINE name1=fred Lee name2=jim name3=jim name4=fred printf( \nprima\nname1=%s\nname2=%s\nname3=%s, name1, name2, name3); strcpy(name1, Fred ); strcpy(name2, Fred ); strcpy(name4,name1); name3 = name2; printf( \ndopo\nname1=%s\nname2=%s\nname3=%s\nname4=%s, name1, name2, name3, name4); strcat(name1, Lee ); strcpy(name2, Jim ); printf( \ninfine\nname1=%s\nname2=%s\nname3=%s\nname4=%s, name1, name2, name3, name4); return 0; 39

Confronto strcpy(string1, Apple ); strcpy(string2, Wax ); if (strcmp(string1, string2) < 0) { printf( %s %s\n, string1, string2); } else { printf( %s %s\n, string2, string1); } Restituisce La differenza tra i codici ASCII dei caratteri (presi a due a due) delle due stringhe nello stesso ordine in cui vengono scritte; alla prima differenza non nulla, ritornano tale valore 40

Confronto strcpy(string1, Apple ); strcpy(string2, Wax ); if (strcmp(string1, string2) < 0) { printf( %s %s\n, string1, string2); } else { printf( %s %s\n, string2, string1); } output: Apple Wax 41

Errore tipico Confronto errato strcpy(string1, Apple ); strcpy(string2, Wax ); if (string1 < string2) { printf( %s %s\n, string1, string2); } else { printf( %s %s\n, string2, string1); } 42

Lunghezza char string1[100]; strcpy(string1, Apple ); printf( %d\n, strlen(string1)); output: 5 43

Stringhe di caratteri come parametri Le stringhe come parametri formali sono dichiarate char* o char[] Esempi: void Greet ( char* name ) void Greet ( char name[] ) In tutto e per tutto sono vettori! 44

Example: hello3.c #include <stdio.h> #include <string.h> #define NAMELEN 50 /* Stampa un saluto */ void Greet ( char * name ) { } strcat(name, "! Come va?"); int main() { char user[namelen]; } printf( Chi sei? "); scanf("%s", user); Greet(user); printf("%s\n", user); return 0; user è Jake\0 45

Example: hello3.c #include <stdio.h> #include <string.h> #define NAMELEN 50 /* Stampa un saluto */ void Greet ( char * name ) { } strcat(name, "! Come va?"); int main() { char user[namelen]; } printf("who are you? "); scanf("%s", user); Greet(user); printf("%s\n", user); return 0; name punta user è Jake\0 46

Example: hello3.c #include <stdio.h> #include <string.h> #define NAMELEN 50 /* Stampa un saluto */ void Greet ( char * name ) { } strcat(name, "! Come va?"); int main() { char user[namelen]; } printf("who are you? "); scanf("%s", user); Greet(user); printf("%s\n", user); return 0; name punta user è Jake! Come va?\0 47

Example: hello3.c #include <stdio.h> #include <string.h> #define NAMELEN 50 /* Stampa un saluto */ void Greet ( char * name ) { } strcat(name, "! Come va?"); int main() { char user[namelen]; printf("who are you? "); scanf("%s", user); Greet(user); printf("%s\n", user); } return 0; user è Jake! Come va?\0 48

Sommario Una stringa è un array continuo di caratteri L identificatore di stringa è l indirizzo stesso del primo carattere della stringa Ogni singolo carattere è individuato usando la notazione tipica ad array nome-stringa[indice] Esistono librerie C standard per copiare, concatenare e confrontare le stringhe 49

Deitel & Deitel Capitolo 8: 8.1 8.7 50

Stringhe di caratteri 10/08/06 1

CSE1301 Sem 2-2003 Sommario Rappresentazione Dichiarazione Indice di un carattere in una stringa Operazione su stringhe Errori comuni 10/08/06 2 Lecture 20: Character Strings 2

08/10/06 Rappresentazione Ricorda: In memoria le celle di un array sono contigue ogni cella ha un indirizzo 0x1FFE 0x1FFF 0x2000 0x2001 0x2002 etc 10/08/06 3

08/10/06 Rappresentazione Ricorda: Nella dichiarazione una variabile è un contenitore di un valore Esempio char ch; ch = B ; 0x1FFE 0x1FFF 0x2000 0x2001 0x2002 B 10/08/06 ch 4 etc

08/10/06 Rappresentazione Dichiarazione di una stringa individua un array di celle ogni cella contiene un char fornisce l indirizzo della prima cella Esempio char name[5]; Specifica il numero di celle dell array 10/08/06 5

08/10/06 Rappresentazione Dichiarazione di una stringa individua un array di celle ogni cella contiene un char fornisce l indirizzo della prima cella Esempio char name[5]; name è 0x2000 0x2000 0x2004 10/08/06 6

CSE1301 Sem 2-2003 Array e stringhe di caratteri Una stringa di caratteri è un array di char Una stringa di caratteri deve avere il carattere terminale ( \0 ) Il carattere terminale permette a scanf() e printf() di manipolare le stringhe efficacemente 10/08/06 7 Lecture 20: Character Strings 7

08/10/06 Stringhe di caratteri Dichiarazione char name[5]; Dichiarazione #define MAXLENGTH 5 char name[maxlength]; name è 0x2000 0x2000 0x2004 10/08/06 8

08/10/06 Input/Output di stringhe #include <stdio.h> #define MAXLENGTH 15 Non serve &, il nome stesso individua l indirizzo int main() { char string1[maxlength]; char string2[maxlength]; scanf("%s %s", string1, string2); printf("%s %s\n", string1, string2); } return 0; 10/08/06 9

08/10/06 Dichiarazione di stringhe Dichiarazione char name[5] = Ann ; Carattere terminale \0, segna il fine-stringa name è 0x2000 0x2000 A n n \0 0x2004 10/08/06 10

08/10/06 Dichiarazione di stringhe Dichiarazione Al più 4 lettere, l ultima deve essere \0 char name[5] = Ann ; name è 0x2000 A n n \0 0x2000 0x2004 10/08/06 11

08/10/06 Dichiarazione di stringhe Dichiarazione char name[] = Ann ; Usa una cella extra per \0 name è 0x2000 0x2000 A n n \0 0x2003 10/08/06 12

CSE1301 Sem 2-2003 Dichiarazione di stringhe Dichiarazione char *name = Ann ; Se si prova a modificare questa stringa, il risultato è segmentation fault 0x3000 name A n n \0 0x3000 0x3003 10/08/06 13 Lecture 20: Character Strings 13

08/10/06 Dichiarazione di stringhe Dichiarazione char name[]; Stringa di lunghezza arbitraria? No, errore! 10/08/06 14

08/10/06 Un carattere in una stringa La dimensione di una stringa di caratteri è fissata Per raggiungere il carattere alla posizione indice, l (indice+1)-esimo carattere: string[indice] Il primo carattere ha indice 0 10/08/06 15

08/10/06 Un carattere in una stringa 0x3995 0x399C name è 0x3995 J o h n \0 indice 0 indice 4 char name[8] = John ; int i = 2; printf( Il carattere in posizione %d è %c.\n, i, name[i]); output: Il carattere in posizione 2 è h. 10/08/06 16

08/10/06 Un carattere in una stringa 0x3995 0x399C name è 0x3995 J o hx n \0 indice 2 char name[8] = John ; name[2] = X ; printf( Nome: %s\n, name); 10/08/06 17

08/10/06 Un carattere in una stringa 0x3995 0x399C name è 0x3995 J o X n \0 indice 2 char name[8] = John ; name[2] = X ; printf( Nome: %s\n, name); output: Nome: JoXn 10/08/06 18

08/10/06 Operazioni con le stringhe #include <string.h> Assegnamento: strcpy() Concatenazione: strcat() Confronto: strcmp() Lunghezza: strlen() 10/08/06 19

08/10/06 Assegnamento #include <stdio.h> #include <string.h> #define MAXLENGTH 100 int main() { char string1[maxlength]; char string2[maxlength]; strcpy(string1, Hello World! ); strcpy(string2, string1); } return 0; string1: <spazzatura> string2: <spazzatura> 10/08/06 20

08/10/06 Assegnamento #include <stdio.h> #include <string.h> #define MAXLENGTH 100 int main() { char string1[maxlength]; char string2[maxlength]; strcpy(string1, Hello World! ); strcpy(string2, string1); } return 0; string1: Hello World! string2: <spazzatura> 10/08/06 21

08/10/06 Assegnamento #include <stdio.h> #include <string.h> #define MAXLENGTH 100 int main() { char string1[maxlength]; char string2[maxlength]; strcpy(string1, Hello World! ); strcpy(string2, string1); } return 0; string1: Hello World! string2: Hello World! 10/08/06 22

CSE1301 Sem 2-2003 Esempio char name1[5] = Ann ; char name2[5] = Dave ; name2 = name1; Errori Comuni Utilizzo del nome di stringa come Lvalue (variabile di tipo indirizzo) Errore! Richiesta una Lvalue-expression! - name2 contiene l indirizzo del primo valore dell array ma non è una variabile di tipo indirizzo 10/08/06 23 Lecture 20: Character Strings 23

CSE1301 Sem 2-2003 Esempio Errori Comuni Utilizzo del nome di stringa come Lvalue (variabile di tipo indirizzo) char name1[5] = Ann ; char name2[5] = Dave ; &(name2[0]) = name1; Errore! Richiesta una Lvalue-expression! - &(name2[0]) restituisce l indirizzo del primo valore dell array ma non è una variabile di tipo indirizzo 10/08/06 24 Lecture 20: Character Strings 24

08/10/06 Attenzione Assegnamento di indirizzo Esempio char *name1 = Ann ; char *name2 = Dave ; name2 = name1; 10/08/06 25

08/10/06 Attenzione Assegnamento di indirizzo char *name1 = Ann ; char *name2 = Dave ; 0x2000 name1 A n n \0 0x2000 0x2003 0x3990 name2 D a v e \0 0x3990 0x3994 10/08/06 26

08/10/06 Attenzione Assegnamento di indirizzo name2 = name1; 0x2000 name1 A n n \0 0x2000 0x2003 0x2000 name2 D a v e \0 0x3990 0x3994 10/08/06 27

08/10/06 Concatenazione char string1[maxlength]; char string2[maxlength]; strcpy(string1, Goodbye ); strcpy(string2,, Cruel ); strcat(string1, string2); strcat(string1, string2); strcat(string1, World! ); string1: Goodbye string2:, Cruel 10/08/06 28

08/10/06 Concatenazione char string1[maxlength]; char string2[maxlength]; strcpy(string1, Goodbye ); strcpy(string2,, Cruel ); strcat(string1, string2); strcat(string1, string2); strcat(string1, World! ); string1: Goodbye, Cruel string2:, Cruel 10/08/06 29

08/10/06 Concatenazione char string1[maxlength]; char string2[maxlength]; strcpy(string1, Goodbye ); strcpy(string2,, Cruel ); strcat(string1, string2); strcat(string1, string2); strcat(string1, World! ); string1: Goodbye, Cruel, Cruel string2:, Cruel 10/08/06 30

08/10/06 Concatenazione char string1[maxlength]; char string2[maxlength]; strcpy(string1, Goodbye ); strcpy(string2,, Cruel ); strcat(string1, string2); strcat(string1, string2); strcat(string1, World! ); string1: Goodbye, Cruel, Cruel World! string2:, Cruel 10/08/06 31

08/10/06 Errori Comuni Spazio insufficente char name[] = Ann ; strcpy(name, David ); name è 0x2000 A n n \0 0x2000 0x2003 10/08/06 32

08/10/06 Errori Comuni Spazio insufficente char name[] = Ann ; strcpy(name, David ); name è 0x2000 D a v i d \0 0x2000 0x2003 10/08/06 33

08/10/06 Errore tipico Spazio insufficente char name[5]; strcpy(name, David ); Non dimenticare il carattere \0 name è 0x3990 D a v i d \0 0x3990 0x3994 10/08/06 34

08/10/06 Errori Comuni Spazio insufficente char name[5]; strcpy(name, Ann ); strcat(name, Smith ); name è 0x2000 A n n \0 0x2000 0x2004 10/08/06 35

08/10/06 Errori Comuni Spazio insufficente char name[5]; Ma in pratica? Vediamo cosa succede.. strcpy(name, Ann ); strcat(name, Smith ); name è 0x2000 A n n S m i t h \0 0x2000 0x2004 10/08/06 36

CSE1301 Sem 2-2003 Esempio: strassign.c #include <stdio.h> #include <string.h> #define MAXLENGTH 5 int main() { char name1[maxlength] = Ann ; char name2[] = Ann ; char *name3 = John ; char name4[maxlength]; } PRIMA name1=ann name2=ann name3=john printf( \nprima\nname1=%s\nname2=%s\nname3=%s, name1, name2, name3); strcpy(name1, Fred ); strcpy(name2, Fred ); strcpy(name4,name1); name3 = name2; printf( \ndopo\nname1=%s\nname2=%s\nname3=%s\nname4=%s, name1, name2, name3, name4); strcat(name1, Lee ); strcpy(name2, Jim ); printf( \ninfine\nname1=%s\nname2=%s\nname3=%s\nname4=%s, name1, name2, name3, name4); return 0; 10/08/06 37 Lecture 20: Character Strings 37

CSE1301 Sem 2-2003 Esempio: strassign.c #include <stdio.h> #include <string.h> #define MAXLENGTH 5 int main() { char name1[maxlength] = Ann ; char name2[] = Ann ; char *name3 = John ; char name4[maxlength]; } DOPO name1=fred name2=fred name3=fred name4=fred printf( \nprima\nname1=%s\nname2=%s\nname3=%s, name1, name2, name3); strcpy(name1, Fred ); strcpy(name2, Fred ); strcpy(name4,name1); name3 = name2; printf( \ndopo\nname1=%s\nname2=%s\nname3=%s\nname4=%s, name1, name2, name3, name4); strcat(name1, Lee ); strcpy(name2, Jim ); printf( \ninfine\nname1=%s\nname2=%s\nname3=%s\nname4=%s, name1, name2, name3, name4); return 0; 10/08/06 38 Lecture 20: Character Strings 38

CSE1301 Sem 2-2003 Esempio: strassign.c #include <stdio.h> #include <string.h> #define MAXLENGTH 5 int main() { char name1[maxlength] = Ann ; char name2[] = Ann ; char *name3 = John ; char name4[maxlength]; } INFINE name1=fred Lee name2=jim name3=jim name4=fred printf( \nprima\nname1=%s\nname2=%s\nname3=%s, name1, name2, name3); strcpy(name1, Fred ); strcpy(name2, Fred ); strcpy(name4,name1); name3 = name2; printf( \ndopo\nname1=%s\nname2=%s\nname3=%s\nname4=%s, name1, name2, name3, name4); strcat(name1, Lee ); strcpy(name2, Jim ); printf( \ninfine\nname1=%s\nname2=%s\nname3=%s\nname4=%s, name1, name2, name3, name4); return 0; 10/08/06 39 Lecture 20: Character Strings 39

08/10/06 Confronto strcpy(string1, Apple ); strcpy(string2, Wax ); if (strcmp(string1, string2) < 0) { printf( %s %s\n, string1, string2); } else { printf( %s %s\n, string2, string1); } Restituisce La differenza tra i codici ASCII dei caratteri (presi a due a due) delle due stringhe nello stesso ordine in cui vengono scritte; alla prima differenza non nulla, ritornano tale valore 10/08/06 40

08/10/06 Confronto strcpy(string1, Apple ); strcpy(string2, Wax ); if (strcmp(string1, string2) < 0) { printf( %s %s\n, string1, string2); } else { printf( %s %s\n, string2, string1); } output: Apple Wax 10/08/06 41

08/10/06 Errore tipico Confronto errato strcpy(string1, Apple ); strcpy(string2, Wax ); if (string1 < string2) { printf( %s %s\n, string1, string2); } else { printf( %s %s\n, string2, string1); } 10/08/06 42

08/10/06 Lunghezza char string1[100]; strcpy(string1, Apple ); printf( %d\n, strlen(string1)); output: 5 10/08/06 43

CSE1301 Sem 2-2003 Stringhe di caratteri come parametri Le stringhe come parametri formali sono dichiarate char* o char[] Esempi: void Greet ( char* name ) void Greet ( char name[] ) In tutto e per tutto sono vettori! 10/08/06 44 Lecture 20: Character Strings 44

08/10/06 Example: hello3.c #include <stdio.h> #include <string.h> #define NAMELEN 50 /* Stampa un saluto */ void Greet ( char * name ) { strcat(name, "! Come va?"); } int main() { char user[namelen]; } printf( Chi sei? "); scanf("%s", user); Greet(user); printf("%s\n", user); return 0; user è Jake\0 10/08/06 45

08/10/06 Example: hello3.c #include <stdio.h> #include <string.h> #define NAMELEN 50 /* Stampa un saluto */ void Greet ( char * name ) { strcat(name, "! Come va?"); } int main() { char user[namelen]; } printf("who are you? "); scanf("%s", user); Greet(user); printf("%s\n", user); return 0; name punta user è Jake\0 10/08/06 46

08/10/06 Example: hello3.c #include <stdio.h> #include <string.h> #define NAMELEN 50 /* Stampa un saluto */ void Greet ( char * name ) { strcat(name, "! Come va?"); } int main() { char user[namelen]; } printf("who are you? "); scanf("%s", user); Greet(user); printf("%s\n", user); return 0; name punta user è Jake! Come va?\0 10/08/06 47

08/10/06 Example: hello3.c #include <stdio.h> #include <string.h> #define NAMELEN 50 /* Stampa un saluto */ void Greet ( char * name ) { strcat(name, "! Come va?"); } int main() { char user[namelen]; } printf("who are you? "); scanf("%s", user); Greet(user); printf("%s\n", user); return 0; user è Jake! Come va?\0 10/08/06 48

08/10/06 Sommario Una stringa è un array continuo di caratteri L identificatore di stringa è l indirizzo stesso del primo carattere della stringa Ogni singolo carattere è individuato usando la notazione tipica ad array nome-stringa[indice] Esistono librerie C standard per copiare, concatenare e confrontare le stringhe 10/08/06 49

08/10/06 Deitel & Deitel Capitolo 8: 8.1 8.7 10/08/06 50