You are on page 1of 32

CARATTERI E STRINGHE

Caratteri e stringhe Funzioni della libreria standard I/O Funzioni della libreria di gestione delle stringhe

© 2000 Prentice Hall, Inc. All rights reserved.

Caratteri e stringhe
• Caratteri – Sono i blocchi costitutivi di ogni programma: Ogni programma è una successione di caratteri raggruppati opportunamente – Si indicano fra apici: 'z' rappresenta il carattere z • Stringhe – Serie di caratteri trattati come una singola unità • Possono comprendere lettere, numeri ed alcuni simboli speciali (*, /, $) – Le stringhe letterali (costanti) – si scrivono fra doppi apici "Hello" – Le stringhe sono array di caratteri • Il nome della stringa è il puntatore al suo primo carattere • Il valore di una stringa è l’indirizzo del suo primo carattere

© 2000 Prentice Hall, Inc. All rights reserved.

Le stringhe
È possibile definire array per gestire qualsiasi tipo di dato semplice, int, float, char, .... In genere una collezione di numeri interi è comoda per tenere uniti tutti i dati, che però hanno un significato proprio. Quando si parla di caratteri, invece, può essere interessante poter manipolare l'intero insieme di caratteri appartenenti ad un array, in quanto costituiscono nell'insieme un vocabolo o un'intera frase (con i debiti spazi). Il C consente quindi di interpretare una sequenza di caratteri come una singola unità, per una più efficiente manipolazione e vi è una apposita libreria standard - string.h - con funzioni di utilità di frequente utilizzo.
© 2000 Prentice Hall, Inc. All rights reserved.

#define DIM 20 char Vocabolo[DIM+1]. Inc.STRINGHE Dichiarazione di stringhe – Si dichiara come un array di caratteri o come una variabile di tipo char * char color[] = "blue". All rights reserved. come si fa per ogni altro tipo di array. È possibile accedere ad ogni elemento dell'array singolarmente. È inoltre possibile manipolare l'intero array come un'unica entità purché esista un carattere terminatore '\0' in uno degli elementi dell'array. È importante ricordarsi di dimensionare opportunamente l'array includendo un elemento anche per contenere il terminatore. char *colorPtr = "blue". oppure direttamente da programma durante l'esecuzione. © 2000 Prentice Hall. . Ad esempio. che sia stato inserito dalle funzioni di manipolazione della stringa. – Le stringhe rappresentate come array di caratteri devono terminare con '\0' color ha 5 elementi Si consideri la seguente dichiarazione di un array di caratteri di 20 elementi: char Vocabolo[20]. se un algoritmo prevede che si debba gestire vocaboli "di al più 20 caratteri" è necessario dichiarare un array di 21 elementi.

while (frase[i]!='\0') { printf("%c\n". Inc. i++. } } © 2000 Prentice Hall. All rights reserved.h> char frase[] = "Analisi dei requisiti "./* Visualizzazione caratteri di una stringa */ #include <stdio. main() { int i=0. frase[i]). .

INPUT DA TASTIERA DI STRINGHE • Introdurre una stringa da tastiera –Si usa scanf scanf("%s". che non richiede & (perchè una stringa è un puntatore) –Bisogna ricordarsi che viene aggiunto uno spazio per '\0' © 2000 Prentice Hall. word). Inc. All rights reserved. Copia l’input in word[]. .

Non è possibile scrivere: a = "prova". Questo fatto ha effetto anche sulla inzializzazione degli array.ASSEGNARE UNA STRINGA AD UN’ALTRA char a[l0]. perché a indica l'inizio dell'array (è un puntatore) mentre "prova" è una stringa costante (dovrei scrivere a[]=“prova”. All rights reserved. Quindi. b = a. b[10]. La parte di codice non copia ordinatamente i caratteri presenti nell'array a nei caratteri dell'array b.) © 2000 Prentice Hall. . modificando poi i valori di b si modificano quelli di a. Ciò che viene effettivamente ottenuto è che b punti allo stesso insieme di caratteri di a senza farne una copia. Inc.

tra cui citiamo solo l'importante funzione di confronto tra stringhe. © 2000 Prentice Hall. . All rights reserved. Inc.char[]) che effettivamente effettua la copia elemento ad elemento dell'array a nell'array b fino al carattere terminatore.Copia e confronto di stringhe Per copiare il contenuto di una stringa in un'altra è necessaria la funzione (di libreria <string.char[]) confronta due stringhe e restituisce 0 se il loro contenuto è identico. La funzione int strcmp(char[]. Infatti il confronto a == b darebbe esito positivo solamente se i due array puntassero allo stesso insieme di caratteri. e non se il loro contenuto fosse identico.h>): char * strcopy(char[]. Ci sono numerose altre funzioni.

char *gets( char *s ). © 2000 Prentice Hall. Inc. ma l’output è memorizzato nella stringa s invece di essere visualizzato sul monitor Equivale a scanf... ).h> Prototipo int getchar( void ). const char *format. . Viene inserito il carattere di fine stringa. . All rights reserved. int sprintf( char *s. Stampa il carattere memorizzato in c.. ). Stampa la stringa s seguita da un “a capo” Equivale a printf. Inserisce caratteri nell’array s fino ad un “a capo” o “fine linea”. Descrizione Acquisisce un carattere da tastiera. int sscanf( char *s.. ma l’input è letto dalla stringa s invece che dalla tastiera int putchar( int c ).Alcune funzioni di libreria standard Input/Output • Funzioni in <stdio. int puts( const char *s ). . const char *format.

void reverse(char * ). putchar( s[ 0 ] ). reverse( sentence ). } void reverse(char *s) { if ( s[ 0 ] == '\0' ) return. return 0. printf( "Enter a line of text:\n" ). mentre s[0] sarà inviato all’output.1 /*USO DELLE FUNZIONI gets e putchar */ Outline 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #include <stdio. Quando trova il carattere '\0' stampa con putchar Enter a line of text: Characters and Strings The line printed backwards is: sgnirtS sretcarahC © 2000dna Prentice Hall. } } Stampa di una stringa in ordine inverso Input (una stringa) Definizione della reverse chiama se stessa con sottofunzione ricorsiva stringhe di quella iniziale: inizio del sottovettore che incomincia da s[1]. All rights reserved. . printf( "\nThe line printed backwards is:\n" ).h> int main() { char sentence[ 80 ]. else { reverse( &s[ 1 ] ). Inc. gets( sentence ).

h> char frase[] = "Analisi. while ((s[i] = t[i]) != '\0') i++. discorso). } /* versione 1 . frase. } /* versione 2.2 */ Str_cop(char *s. char discorso[80]. printf(" originale: %s \n copia: %s \n". char *t) { while ((*s = *t) != '\0') {s++. t++. char *t) { while (*s++ = *t++).Copia di una stringa su un’altra (senza funzioni di libreria) /* versione base */ #include <stdio.1 che usa i puntatori*/ Str_cop(char *s. for(i=0. (discorso[i]=frase[i])!='\0'. } © 2000 Prentice Hall. char t[]) { int i=0. requisiti ". Inc.Funzione senza puntatori*/ Str_cop( char s[]. main() { int i.3 */ Str_cop(char *s.} } /* versione 2. i++) . . } /*versione 2. char *t) { while ((*s++ = *t++) != '\0') . All rights reserved.

/* Concatenazione di due stringhe (senza funzioni di libreria)*/ #include <stdio. (frase[i])!='\0'.h> char frase[160] = "Analisi dei requisiti ". /*i riparte da dove era arrivato. main() { char dimmi[80]. i++. /*alla fine i=lunghezza di frase*/ for(j=0. int i. frase). . All rights reserved.j++). dimmi). scanf("%s". i++). (frase[i]=dimmi[j])!='\0'. } © 2000 Prentice Hall. Inc. for(i=0. j parte da 0 fino alla fine della stringa dimmi*/ printf("frase: %s \n". j. printf("Inserisci una parola: ").

i++./* Concatenazione di due stringhe Introduzione della seconda stringa con getchar */ #include <stdio. Inc. . frase[i]!='\0'. i++) . int i. /*acquisisce caratteri fino a newline (\n)*/ dimmi[i]='\0'.h> char frase[160] = "Analisi. (dimmi[i]=getchar())!='\n'. (frase[i]=dimmi[j])!='\0'. printf(" frase: %s \n". j. i++) . } © 2000 Prentice Hall. for(i=0. main() { char dimmi[80]. All rights reserved.j++) . printf("Inserisci una parola: "). frase). requisiti ". for(i=0. for(j=0.

int i. seconda[i]='\0'. printf("Inserisci una parola: "). i++) /*si deve avere simultaneamente: nessuna delle due stringhe è terminata e coincidono Se questo non è verificato per qualche i è inutile continuare*/ if(prima[i]==seconda[i]) printf("Sono uguali\n"). main() { char seconda[80]. for(i=0. ((seconda[i]=getchar()) != '\n') && (i<80) . else printf("La seconda e' maggiore della prima\n")./* Confronto fra due stringhe (senza funzioni di libreria)*/ #include <stdio. } © 2000 Prentice Hall. else if(prima[i]>seconda[i]) printf("La prima e' maggiore della seconda\n"). .h> char prima[160] = "mareggiata".i++) . Inc. (prima[i] == seconda[i]) && (prima[i] != '\0') && (seconda[i] != '\0'). /*l’ultimo elemento è posto =\0*/ for(i=0. All rights reserved.

Concatena fino a n caratteri della stringa s2 a s1. const char *s2 ) char *strncat( char *s1. Restituisce s1. o positivo (s1 > s2) © 2000 Prentice Hall. const char *s2 ). Confronta fino a n caratteri di s1 con s2 Restituisce un numero negativo (s1 < s2). o positivo (s1 > s2) int strncmp( const char *s1. const char *s2. Restituisce s1. Restituisce s1 Copia fino a n caratteri della stringa s2 in s1. size_t n ) char *strcat( char *s1. Inc. size_t n ) Descrizione Copia la stringa s2 in s1. const char *s2. Il primo carattere di s2 è sovrascritto su carattere di fine stringa di s1.Funzioni di libreria per la gestione di stringhe Prototipo char *strcpy( char *s1. . int strcmp( const char Confronta la stringa s1 con s2 *s1. Il primo carattere di s2 è sovrascritto su carattere di fine stringa di s1. All rights reserved. zero (s1 == s2). size_t n ). Restituisce un numero negativo (s1 < s2). Restituisce s1. const char *s2 ) char *strncpy( char *s1. Concatena s2 a s1. zero (s1 == s2). const char *s2.

strlen(str)). return i.h> char str[] = “INFORMATICA". . Inc. main() { printf("la stringa %s ha lunghezza %d\n". str. All rights reserved. } © 2000 Prentice Hall. int strlen(char *). } int strlen(char *p) { int i = 0.Lunghezza di una stringa con strlen #include <stdio. while (*p++) i++.

h> 4 #include <string. s1. 6 ) = Happy strcat( s3. char s1[ 20 ] = "Happy ". s2 ) = %s\n". s1. printf( "strncat( s3. s1. s2 ) = Happy New Year strncat( s3. s1.h> 5 6 int main() 7 { 8 9 10 11 12 13 14 15 16 17 } printf( "s1 = %s\ns2 = %s\n". char s3[ 40 ] = "". . strcat( s1. return 0. s2 ). s2 ) ). printf( "strcat( s1. 6 ) ). s1 ) = %s\n". Concatenazione di stringhe Chiamata delle funzioni di libreria strcat e strncat (restituiscono la prima stringa) s1 = Happy s2 = New Year strcat( s1. strcat( s3. printf( "strcat( s3. s1 ) ).1 /* Fig.19: fig08_19. 8. s1 ) = Happy Happy New Year Output © 2000 Prentice Hall.c 2 Using strcat and strncat */ Outline 3 #include <stdio. 6 ) = %s\n". char s2[] = "New Year ". strncat( s3. Inc. All rights reserved.

i++) . frase). strncat(frase. 5). for(i=0. dimmi. printf("%s \n"./* Concatenazione di dei primi n caratteri di una stringa su di un'altra con strcat */ #include <stdio. int i.h> char frase[160] = "Analisi. } © 2000 Prentice Hall.h> #include <string. ((dimmi[i]=getchar())!='\n') && (i<80). Inc. dimmi[i] = '\0'. requisiti". All rights reserved. main() { char dimmi[80]. .

main() { char seconda[80]. for(i=0.h> char prima[160] = "mareggiata". seconda))) == 0) printf("Sono uguali\n"). i++) . int i. /*x==0 se le stringhe sono uguali*/ if( (x = (strcmp(prima. . /*x<0 se la 1° è minore della 2°*/ else printf("la seconda e' maggiore della prima\n"). else if(x>0) /*x>0 se la 1° è maggiore della 2° */ printf("la prima e' maggiore della seconda\n"). seconda[i] = '\0'. } © 2000 Prentice Hall./* Confronto tra due stringhe con strcmp */ #include <stdio. All rights reserved.h> #include <string. printf("Inserisci una parola: "). Inc. x. ((seconda[i]=getchar())!='\n') && (i<80).

seconda[i]='\0'. else printf("La seconda e' maggiore della prima\n"). 5)))==0) printf("Sono uguali\n"). for(i=0. if((x=(strncmp(prima.h> #include <string. Inc. seconda. All rights reserved. requisiti". x.h> char prima[160] = "Analisi. . } © 2000 Prentice Hall. main() { char seconda[80]. else if(x>0) printf("La prima e' maggiore della seconda\n"). int i./* Confronto dei primi n caratteri di due stringhe con strncmp */ #include <stdio. ((seconda[i]=getchar())!='\n') && (i<80). i++) .

puntatori Definizione della ampiezza del campo e della precisione di stampa Input formattato con scanf © 2000 Prentice Hall. All rights reserved. stringhe. . Inc.Input/Output formattato Output formattato con printf Stampa di interi Stampa di numeri floating point Stampa di caratteri.

Inc. Intero esadecimale senza segno Si pone prima di uno specificatore di intero a indicare un intero short oppure long © 2000 Prentice Hall. Intero decimale senza segno.) Intero ottale senza segno. . (Nota: i e d sono diversi se usati con scanf. All rights reserved.Stampa di interi Specificatore di formato d i o u x or X h or l (letter l) Descrizione Intero decimale con segno. Intero decimale con segno.

3 corrisp. . Inc. o maggiore o uguale alla precisione (6 cifre di default) © 2000 Prentice Hall.503 x 10² in notazione scientifica • 150.2300 becomes 1. a 1.5) – Notazione esponenziale (notazione scientifica) • 150. a 1.23) • Si usa la notazione esponenziale se l’esponente è minore di -4.503E+02 in notazione esponenziale (E indica esponente) • Si usa e o E – f – Stampa il numero con almeno una cifra dopo il punto decimanle – g (o G) – stampa in formato f o e(E) eliminando gli zeri superflui (1. All rights reserved.Stampa di numeri in virgola mobile Numeri in virgola mobile – Sono i numeri con il punto decimale (33.3 corrisp.

Stampa di caratteri. 'z' e '\0') p – Stampa il valore del puntatore (indirizzo di memoria) © 2000 Prentice Hall. . stringhe e puntatori c – Stampa una variabile di tipo char – Non si può usare per stampare il primo elemento di una stringa s – Ha come argomento un puntatore a char – Stampa i caratteri finchè non incontra il carattere NULL ('\0') – Non può stampare un char NOTA – Apici singoli per i char ('z') – Apici doppi per le stringhe "z" (che in effetti contiene due caratteri. Inc. All rights reserved.

Outline Inizializzazione delle variabili Stampa return 0.1 2 /* STAMPA DI CARATTERI E STRINGHE */ 3 #include <stdio. char *stringPtr = "This is also a string". . char string[] = "This is a string". Inc. A This is a string This is a string This is also a string Output © 2000 Prentice Hall. "%s\n".h> 4 5 int main() 6 { 7 8 9 10 11 12 13 14 15 16 17 } char character = 'A'. All rights reserved. "%s\n". "This is a string" ). character ). string ). stringPtr ). "%s\n". printf( printf( printf( printf( "%c\n".

– Effettua arrotondamenti. Formato – printf( stringa-controllo-formato. allineamenti. . inserimento di caratteri. ecc. e termina con lo specificatore di formato © 2000 Prentice Hall. Inc. argomenti). All rights reserved. esadecimale. – Stringa-controllo-formato: descrive il formato di uscita – Argomenti: corrispondono ad ogni specificazione nella stringa di controllo del formato • Ogni specificazione inizia con il simbolo %. formato esponenziale. giustificazione a destra/sinistra. precisione.ecc.FORMATTAZIONE DELL’OUTPUT CON PRINTF printf – Formattazione precisa dell’output Specificatori di conversione: ampiezza.

se è troppo piccola. Si pone fra % e lo specificatore di conversione: – %4d – indica un campo di ampiezza 4 – Se l’ampiezza indicata è maggiore del dato. viene incrementata Precisione – Per gli interi (default 1) – è il minimo numero di cifre da stampare – Per i floating point – è il numero di cifre che devono apparire dopo il punto decimale (per e ed f. All rights reserved. questo viene “giustificato” a destra. per g è il massimo numero di cifre significative – Per le stringhe – è il massimo numero di caratteri della stringa che devono essere scritti © 2000 Prentice Hall. Inc. .Ampiezza del campo e precisione Ampiezza del campo – Dimensione (intera) del campo in cui stampare l’uscita.

Inc. 2.*f". 98.3f – Si può combinare con l’ampiezza del campo %5.) seguito dalla precisione.) Formato floating point – Precisione: si usa un punto (.Ampiezza del campo e precisione (cont.736 ). © 2000 Prentice Hall. dopo % %. All rights reserved. . Es: 1.234) – Si possono usare espressioni intere per calcolare ampiezza e precisione • Si può usare * per indicare il default • Ampiezza negativa – giustifica a sinistra • Ampiezza positiva – giustifica a destra • La precisione deve essere positiva printf( "%*. 7.3f (campo di ampiezza 5 con 3 cifre decimali.

"\t%. "Using precision for floating-point numbers\n" ).11s\n". f ). f. FLOAT E STRINGHE */ #include <stdio. s ).3e\n\t%.239e+02 124 Using precision for strings Happy Birth Output © 2000 Prentice Hall.h> int main() { int i = 873. Inc. "\t%.1 /* 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 USO DELLA PRECISIONE NEL PRINTF PER INTERI.94536. "\t%.3g\n\n".945 1. Outline Inizializzazione delle variabili f=punto decimale e=esponenziale g=arrotondamento return 0. All rights reserved. . char s[] = "Happy Birthday". f. double f = 123. "Using precision for strings\n" ). } Using precision for integers 0873 000000873 Using precision for floating-point numbers 123.4d\n\t%. printf( printf( printf( printf( printf( printf( "Using precision for integers\n" ). i. i ).3f\n\t%.9d\n\n".

argomenti). . All rights reserved.Formattazione dell’input con Scanf scanf – Formattazione dell’input – Caratteristiche • Consente l’input di qualsiasi tipo di dati • Immette o salta specifici caratteri Formato scanf(stringa-controllo-formato. – Stringa-controllo-formato : descrive il formato degli ingressi – Argomenti : puntatori a variabili in cui vengono salvati i dati letti – Può includere l’ampiezza del campo per leggere un numero specifico di caratteri © 2000 Prentice Hall. Inc.

h or l Posto prima di una delle conversioni di interi. L’argomento corrispondente è un puntatore a char. non viene aggiunto ('\0'). specifica se l’input è un intero short o long. p Memorizza il numero di caratteri immessi fino a questo punto con scanf. . Caratteri e stringhe Legge un carattere. All rights reserved. ottale o esadecimale con eventuale segno. Floating-point s e. L’argomento corrispondente è un puntatore a intero. L’argomento corrispondente è un puntatore a intero senza segno. E. f.SCANF SPECIFICATORE DI DESCRIZIONE CONVERSIONE Interi Intero decimale con eventuale segno. o Legge un intero decimale senza segno. L’argomento corrispondente è un puntatore a intero senza segno. L’argomento corrispondente è n un puntatore a intero © 2000 Prentice Hall. c Legge una stringa. Varia Legge un indirizzo della stessa forma di quello che si ottiene con %p in un printf. Legge un intero ottale. Inc. l or L Posto prima di una delle conversioni di floating-point conversion specifica se l’input è double o long double. u x or X Legge un intero esadecimale. L’argomento corrispondente è un puntatore a floating point. L’argomento corrispondente è un puntatore a array di tipo char di dimensioni s sufficienti per contenere la stringa e il carattere ('\0') che viene aggiunto automaticamente. g or G Numero floating point (reale). d Intero decimale. L’argomento corrispondente è un puntatore a i intero. L’argomento corrispondente è un puntatore a intero senza segno.

printf( "The input was:\n" ). y ). scanf( "%c%s". return 0. Inc. printf( "and the string \"%s\"\n". &x. x ). All rights reserved.h> int main() { char x. printf( "the character \"%c\" ". . y[ 9 ]. printf( "Enter a string: " ).1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 /* LETTURA DI CARATTERI E STRINGHE */ #include <stdio. } Outline Inizializzazione delle variabili Input con scanf Chiede l’immissione di una stringa Il primo carattere della stringa è memorizzato in x. la parte restante in y Il simbolo \” visualizza il carattere doppio apice: “ Enter a string: Sunday The input was: the character "S" and the string "unday" Output © 2000 Prentice Hall. y ).