Caratteri e stringhe

Размер: px
Начинать показ со страницы:

Download "Caratteri e stringhe"

Транскрипт

1 Caratteri e stringhe Caratteri Dato che un computer può memorizzare esclusivamente sequenze di bit, per memorizzare un carattere (e quindi testi) è necessario stabilire una convenzione che associa a un carattere una determinata sequenza di bit, rappresentata ad esempio con un numero intero Lo standard principale si chiama codice ASCII (American Standard Code for Information Interchange), pronunciato aski (/ˈæski/) Il codice ASCII standard stabilisce la corrispondenza tra 128 caratteri e un numero da 0 a 127 (7 bit) 1

2 Caratteri Codice ASCII Caratteri 0-31 Caratteri di controllo 32 spazio Altri caratteri (!, ", #, $, %, ', (, ), *, +, -, /,.,,) Cifre da 0 a Altri caratteri (:, ;, <, =, Lettere maiuscole (A-Z) Altri caratteri ([, \, ], ^, _, `) Lettere minuscole (a-z) Altri caratteri ({,,, ~) Caratteri In C per indicare un carattere si usano gli apici singoli Es.: 'A' è il carattere A maiuscolo (a cui corrisponde il numero 65 nel codice ASCII) '0' è il carattere della cifra zero (a cui corrisponde il numero 48 nel codice ASCII) 0, senza apici, invece, è il numero zero, diverso dal carattere '0' 2

3 Caratteri Il tipo char è utile per memorizzare un carattere Dato che per memorizzare un carattere il C memorizza il suo codice ASCII, una variabile di tipo char può essere usata sia come numero intero che come carattere Es.: char c = 'A'; e char c = 65; sono equivalenti Dato char d = '3', posso ottenere il suo valore con d-'0', che il C eseguirà come 51-48, cioè 3 Stringhe In C non esiste il tipo stringa Una stringa di caratteri in C è un array di caratteri di una certa dimensione terminato dal carattere '\0' Un array di N caratteri può dunque ospitare stringhe lunghe al più N 1 caratteri perché una cella è destinata al simbolo '\0' char s[8]; m a t t o n e \0 3

4 Manipolazione di stringhe Il C fornisce alcune funzioni per la manipolazione delle stringhe i cui prototipi sono nell header string.h. Tra queste funzioni: size_t strlen(char *str); strlen sta per string length e restituisce il numero di caratteri di cui è composta una stringa (size_t è un tipo intero senza segno; a seconda dell architettura e del compilatore, è un unsigned int o un unsigned long) Es.: #include <string.h> int l; char s[] = "pippo"; l = strlen(s); // l vale 5 Manipolazione di stringhe char* strcpy(char* dst, char* src); strcpy sta per string copy ed effettua una copia tra stringhe. Il primo parametro è la stringa di destinazione e il secondo è la stringa sorgente. Il valore di ritorno di strcpy si usa raramente (è un puntatore allo '\0' finale di dst) Es.: #include <string.h> char s1[10], s2[10]; strcpy(s1, "pippo"); strcpy(s2, s1); N.B.: in C non si può usare una stringa in un assegnamento (s = "stringa") con la sola eccezione della dichiarazione e inizializzazione (char s[] = "stringa";) 4

5 Manipolazione di stringhe int strcmp(char *s1, char *s2); strcmp sta per string compare e confronta due stringhe. Restituisce 0 se le stringhe sono uguali, un numero diverso da 0 se sono diverse (più precisamente negativo se s1 precede s2 lessicograficamente, cioè considerando l ordinamento ASCII, e positivo se s1 segue s2) Es.: #include <string.h> int cmp; char str1[] = "Pippo", str2[] = "pippo"; cmp = strcmp(str1, str2); //cmp è un numero negativo perché 'P'<'p' Leggere un singolo carattere: Stampare un singolo carattere: Esempio: Perché abbiamo usato un int per la variabile c? 5

6 Leggere e scriviamo finché incontriamo l end-of-file while (c!= EOF) { //EOF è definita in stdio.h Trovare almeno altri due modi per scrivere il ciclo 1: for ( c!= EOF; c = getchar()) 6

7 2: while (1) { if (c == EOF) break; 3: for (;;) { if (c == EOF) break; 7

8 4: while ((c = getchar())!= EOF) Scriviamo un programma toupper.c che converta un testo in maiuscolo usando le funzioni getchar, putchar e ciò che abbiamo detto sul tipo char e la codifica ASCII 8

9 Convertiamo un testo in maiuscolo (toupper.c) while (c!= EOF) { if (c >= 'a' && c <= 'z') c = c - ('a' - 'A'); Usando le funzioni di libreria islower e toupper in ctype.h: #include <ctype.h> while (c!= EOF) { if (islower(c)) //in realtà è sufficiente usare direttamente la funzione toupper c = toupper(c); 9

10 Usiamo il programma per rendere maiuscolo il sorgente stesso toupper < toupper.c Se generiamo un nuovo sorgente in questo modo e compiliamo, cosa succede? toupper < toupper.c > pippo.c gcc -o pippo pippo.c I/O di stringhe Input di una stringa char stringa[8]; scanf("%s", stringa); N.B.: In questo caso la variabile non è preceduta da & (i motivi saranno chiari in seguito) Nell input di stringhe, la scanf scarta automaticamente i white space iniziali e continua a leggere fino a quando incontra un white space (quindi non si può usare la scanf in questa forma per leggere una stringa composta da più di una parola) Attenzione: cosa succede se l utente inserisce una stringa con 10 caratteri? 10

11 I/O di stringhe Il C di norma non effettua controlli. Continua a scrivere in memoria anche oltre la fine dell array: si ha un buffer overflow char stringa[8]; p r o g r a m m a \0 In questo modo scanf potrebbe sovrascrivere altre strutture dati oppure scrivere in una zona di memoria in cui il programma non ha il permesso di scrivere (il runtime può dare l errore di segmentation fault). I/O di stringhe Per prevenire questi errori bisogna limitare il numero di caratteri letti in input: scanf("%7s", stringa); In questo modo scanf interrompe la lettura dopo al massimo 7 caratteri (l array ha capienza 8 ma dobbiamo lasciare un carattere per lo '\0' finale). Eventuali caratteri non letti rimangono nel buffer 11

12 I/O di stringhe Per l input di stringhe, la funzione scanf ha due limitazioni: Termina la lettura al primo whitespace Non è agevole limitare il numero di caratteri in input usando il valore di una variabile o una costante simbolica Per questi motivi può essere utile usare, invece, la funzione fgets, che legge righe di testo e accetta come parametro anche la dimensione del vettore di caratteri I/O di stringhe Per utilizzare fgets occorre include stdio.h char* fgets(char *str, int size, FILE *stream); str è l array di char in cui memorizzare la stringa (che può contenere anche spazi) size è la dimensione dell array (quindi la lettura termina al massimo dopo size-1 caratteri letti in modo da lasciare un elemento nell array per lo '\0' finale) stream nel caso di input da tastiera è sempre impostato come stdin (vedremo più in là la lettura da file) In caso di errore restituisce NULL 12

13 I/O di stringhe Nota: a differenza di scanf, fgets conserva al termine della stringa il carattere newline ('\n') (ad eccezione del caso in cui l utente inserisca una stringa più lunga di size 1) Quindi per leggere una stringa con fgets si può scrivere così: char str[size]; if (fgets(str, SIZE, stdin) == NULL) { //trattamento dell errore if (strlen(str) > 0 && str[strlen(str)-1] == '\n') str[strlen(str)-1] = '\0'; //rimozione dell eventuale \n finale Matrici e vettori di stringhe 13

14 Matrici Le matrici sono array bidimensionali Definizione: tipo nome[numero_righe][numero_colonne]; L indice per le righe va da 0 a numero_righe 1, quello delle colonne da 0 a numero_colonne 1 Es.: int matr[3][6]; definisce una matrice matr di 3 righe (con indice da 0 a 2) e 6 colonne (con indice da 0 a 5) Matrici Una matrice viene interpretata dal C come un vettore di vettori Quindi int matr[3][6]; definisce un vettore di 3 elementi ognuno dei quali è un vettore di 6 interi Vengono memorizzati per righe matr[0][4] matr[2][3] matr[0] matr[1] matr[2] 14

15 Vettori di stringhe Un vettore di stringhe, quindi, corrisponde a una matrice di caratteri Esempio: char elenco[10][100]; definisce un vettore di 10 stringhe lunghe ognuna al massimo 99 caratteri Ogni riga della matrice si può usare come una stringa. Ad es. strcpy(elenco[2], "latte"); scanf("%99s", elenco[9]); 15

I CARATTERI E LE STRINGHE

I CARATTERI E LE STRINGHE I CARATTERI E LE STRINGHE IL CODICE ASCII Per memorizzare i simboli grafici corrispondenti ai caratteri bisogna associare un numero intero a ciascuno di essi Il codice ASCII / æski/ (American Standard

Подробнее

Esercitazione di Reti degli elaboratori

Esercitazione di Reti degli elaboratori Esercitazione di Prof.ssa Chiara Petrioli Christian Cardia, Gabriele Saturni Cosa vedremo in questa lezione? Gli Array Gli array multidimensionali Le stringhe I puntatori Esercizi Pagina 1 Gli Array Definizione

Подробнее

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

Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' a p e \0 STRINGHE: ARRAY DI CARATTERI Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' s a p e \0 0 1 2 3 Un vettore di N caratteri può dunque ospitare stringhe lunghe al più N-1

Подробнее

Input/Output di numeri

Input/Output di numeri Input/Output di numeri I/O di numeri Per utilizzare le funzioni di I/O occorre include il file di intestazione (o file header) stdio.h utilizzando all inizio del sorgente la direttiva #include

Подробнее

Lezione 8: Stringhe ed array multidimensionali

Lezione 8: Stringhe ed array multidimensionali Lezione 8: Stringhe ed array multidimensionali Vittorio Scarano Corso di Laurea in Informatica Università degli Studi di Salerno Struttura della lezione AVVISO: la lezione di laboratorio di 28/5 non si

Подробнее

C: panoramica. Violetta Lonati

C: panoramica. Violetta Lonati C: panoramica Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica AA 2009/2010 Violetta Lonati

Подробнее

STRINGHE: ARRAY DI CARATTERI! a p e \0

STRINGHE: ARRAY DI CARATTERI! a p e \0 STRINGHE: ARRAY DI CARATTERI! Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' s a p e \0 0 1 2 3 Un vettore di N caratteri può dunque ospitare stringhe lunghe al più

Подробнее

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

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Stringhe. Anno Accademico 2010/2011 Francesco Tortorella Corso di Informatica Tipi strutturati: Stringhe Anno Accademico 2010/2011 Francesco Tortorella Stringhe di caratteri La stringa è il tipo strutturato con cui vengono rappresentati gruppi di caratteri quali

Подробнее

Stringhe in C. Emilio Di Giacomo

Stringhe in C. Emilio Di Giacomo Stringhe in C Emilio Di Giacomo Stringhe Una stringa è una sequenza finita di caratteri Le stringhe sono un tipo di dati talmente importante e utile che fanno parte di quasi tutti i linguaggi di programmazione

Подробнее

Stringhe e tipi di dati strutturati

Stringhe e tipi di dati strutturati Stringhe e tipi di dati strutturati Marco D. Santambrogio [email protected] Ver. aggiornata al 21 Marzo 2013 Info sui Labs http://tinyurl.com/ieimlabextra Ricordate di portare un adattatore!

Подробнее

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

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore I puntatori Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore...... L operatore & fornisce l indirizzo di un oggetto: p = &c; assegna a p l indirizzo di c, i.e., p

Подробнее

Stringhe e allocazione dinamica della memoria

Stringhe e allocazione dinamica della memoria Stringhe e allocazione dinamica della memoria Esercizio Scrivere un programma strings.c che legge da standard input una sequenza di parole separate da uno o più spazi, e stampa le parole lette, una per

Подробнее

Introduzione alla programmazione in linguaggio C

Introduzione alla programmazione in linguaggio C Introduzione alla programmazione in linguaggio C Il primo programma in C commento Header della libreria Funzione principale Ogni istruzione in C va terminata con un ; Corso di Informatica AA. 2007-2008

Подробнее

Librerie C. Corso di Linguaggi e Traduttori 1 AA Corso di Linguaggi e Traduttori 1 AA stdio.h

Librerie C. Corso di Linguaggi e Traduttori 1 AA Corso di Linguaggi e Traduttori 1 AA stdio.h Corso di Linguaggi e Traduttori 1 AA 2004-05 1 Corso di Linguaggi e Traduttori 1 AA 2004-05 stdio.h 2 Funzioni comuni di I/O? Le piu' comuni funzioni che permettono I/O sono getchar() e putchar():? int

Подробнее

Programmazione I - Laboratorio

Programmazione I - Laboratorio Programmazione I - Laboratorio Esercitazione 4 - Puntatori, vettori e stringhe Gianluca Mezzetti 1 Paolo Milazzo 2 1. Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ mezzetti mezzetti

Подробнее

I/O da tastiera + Alessandra Giordani Lunedì 2 maggio

I/O da tastiera + Alessandra Giordani Lunedì 2 maggio I/O da tastiera + costrutti while e if Alessandra Giordani [email protected] Lunedì 2 maggio 2011 http://disi.unitn.it/~agiordani/ Ripasso funzione printf() Usata per stampare il contenuto di una

Подробнее

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

Informatica 1. Corso di Laurea Triennale in Matematica. Gianluca Rossi Informatica 1 Corso di Laurea Triennale in Matematica Gianluca Rossi [email protected] Dipartimento di Matematica Università di Roma Tor Vergata 11: Stringhe (www.informatica-uno.blogspot.com)

Подробнее

Esercizio 1: funzione con valore di ritorno di tipo puntatore

Esercizio 1: funzione con valore di ritorno di tipo puntatore Esercitazione Fondamenti di Informatica B Corso di Laurea in Ingegneria Meccanica 7 Esercitazione: 14 dicembre 2005 Esercizi su ricorsione, manipolazione stringhe, strutture dinamiche Problema: Esercizio

Подробнее

Primi passi col linguaggio C

Primi passi col linguaggio C Andrea Marin Università Ca Foscari Venezia Laurea in Informatica Corso di Programmazione part-time a.a. 2011/2012 Come introdurre un linguaggio di programmazione? Obiettivi: Introduciamo una macchina astratta

Подробнее

File binari e file di testo

File binari e file di testo I file File binari e file di testo distinzione tra file binari file di testo si possono usare funzioni diverse per la gestione di tipi di file diversi Programmazione Gestione dei file 2 File binari e file

Подробнее

Uso avanzato dei puntatori Allocazione dinamica della memoria

Uso avanzato dei puntatori Allocazione dinamica della memoria Uso avanzato dei puntatori Allocazione dinamica della memoria Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica

Подробнее

LIBRERIE STANDARD in C

LIBRERIE STANDARD in C LIBRERIE STANDARD in C La libreria standard del C è in realtà un insieme di librerie Per usare una libreria, non occorre inserirla esplicitamente nel progetto: ogni ambiente di sviluppo sa già dove cercarle

Подробнее

Il linguaggio C. Puntatori e dintorni

Il linguaggio C. Puntatori e dintorni Il linguaggio C Puntatori e dintorni 1 Puntatori : idea di base In C è possibile conoscere e denotare l indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50;

Подробнее