Il codice ASCII. I caratteri e le stringhe. Il codice ASCII standard. Il codice ASCII standard



Documenti analoghi
I CARATTERI E LE STRINGHE


Alfabeto ed elementi lessicali del linguaggio C

Le stringhe. Le stringhe

CODIFICA DELL INFORMAZIONE E CODICI BINARI

Funzioni in C. Violetta Lonati

Guida di riferimento dei codici a barre

Dati testuali. Caratteri e stringhe. Tipi di dato testuali. Dati testuali. Il sistema dei tipi C. Rappresentazione dei testi

Esempio: dest = parolagigante, lettere = PROVA dest (dopo l'invocazione di tipo pari ) = pprrlogvgante

Introduzione alla programmazione in C

Rappresentazione di informazioni con un alfabeto finito

Trattamento delle STRINGHE in C(++)

Introduzione al Linguaggio C

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Alcune regole di base per scrivere un programma in linguaggio C

Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it

Breve riepilogo della puntata precedente:

= 1*2^7 + 1*2^6 + 0*2^5 + 1*2^4 + 0*2^3 + 0*2^2 + 1*2^1 + 0*2^0 = 210

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 18 31/03/2014

Cos è una stringa (1) Stringhe. Leggere e scrivere stringhe (1) Cos è una stringa (2) DD Cap. 8 pp KP Cap. 6 pp

Caratteri e stringhe Esercizi risolti

Appunti sulla Macchina di Turing. Macchina di Turing

Variabili e tipi di dato

LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO V Indice

Gestione dei File in C

Convertitori numerici in Excel

Editor vi. Editor vi

5.3 TABELLE RECORD Inserire, eliminare record in una tabella Aggiungere record Eliminare record

Lez. 3 L elaborazione (II parte) Prof. Pasquale De Michele Gruppo 2

Operazioni Aritmetiche e Codici in Binario Giuseppe Talarico 23/01/2013

Capitolo Quarto...2 Le direttive di assemblaggio di ASM Premessa Program Location Counter e direttiva ORG

Le variabili. Olga Scotti

INFORMATICA. Automa TRATTAMENTO AUTOMATICO DELLE INFORMAZIONI

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12};

Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE

LINGUAGGI DI PROGRAMMAZIONE

2. Codifica dell informazione

(71,1), (35,1), (17,1), (8,1), (4,0), (2,0), (1,0), (0,1) 0, = 1, 431 0, = 0, 862 0, = 1, 792 0, = 1, 448 0, = 0, 896

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

Inizializzazione, Assegnamento e Distruzione di Classi

Rappresentazione binaria

Rappresentazione dell informazione Codifica Binaria

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Informatica B a.a 2005/06 (Meccanici 4 squadra) PhD. Ing. Michele Folgheraiter

Introduzione al MATLAB c Parte 2

Corso di Fondamenti di Informatica

LETTORE BARCODE V 2.1 EN MANUALE UTENTE

Calcolatori Elettronici Parte X: l'assemblatore as88

Interesse, sconto, ratei e risconti

PROGRAMMA SVOLTO DI INFORMATICA ANNO SCOLASTICO 2013/2014. DOCENTE: Villani Chiara

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

I sistemi di numerazione

Verifica della correttezza formale del numero di partita IVA

Cos è ACCESS? E un programma di gestione di database (DBMS) Access offre: un ambiente user frendly da usare (ambiente grafico)

Uso di base delle funzioni in Microsoft Excel

Sistema operativo: Gestione della memoria

Logica e codifica binaria dell informazione

Problem solving elementare su dati vettoriali

puntatori Lab. Calc. AA 2007/08 1

Richiesta pagina PHP (es: index.php)

Allocazione dinamica della memoria - riepilogo

Spiegazione Open Interest Storico:

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

La codifica dei caratteri di un testo

Rappresentazione delle informazioni

ESAME SCRITTO DI ELEMENTI DI INFORMATICA E PROGRAMMAZIONE. 27 Gennaio 2015

SISTEMI DI NUMERAZIONE E CODICI

void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B

Un ripasso di aritmetica: Rappresentazione binaria - operazioni. riporti

Linguaggio C - Stringhe

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

ci sono più problemi che programmi esiste un problema che non si può risolvere con un programma

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Automatizzare i compiti ripetitivi. I file batch. File batch (1) File batch (2) Visualizzazione (2) Visualizzazione

(Esercizi Tratti da Temi d esame degli ordinamenti precedenti)

Access. Microsoft Access. Aprire Access. Aprire Access. Aprire un database. Creare un nuovo database

Fondamenti di Informatica 2

Prof. Nicola Cappuccio

Esercizi di programmazione in C

4 3 4 = 4 x x x 10 0 aaa

Java:Struttura di Programma. Fabio Scanu a.s. 2014/2015

Introduzione al linguaggio C Gli array

ESERCIZI DI PROBLEM SOLVING E COMPOSIZIONE DEI DIAGRAMMI DI FLUSSO per le classi terza

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Gian Luca Marcialis studio degli algoritmi programma linguaggi LINGUAGGIO C

Struttura a record. File ad accesso diretto. Modalità di apertura. Modalità di apertura

2) Codici univocamente decifrabili e codici a prefisso.

Codifica: dal diagramma a blocchi al linguaggio C++

Laboratorio di Informatica

( x) ( x) 0. Equazioni irrazionali

La codifica dei caratteri di un testo

Esercizio 1. Esercizi 5. Esercizio 3. Esercizio 2 CICLI

INFORMATICA - I puntatori Roberta Gerboni

Interesse, sconto, ratei e risconti

Compilatore risorse display grafico LCD serie IEC-line

Tipi di dato-prima parte

APPELLO SCRITTO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO XI.2015

2. Spiegare brevemente qual è la funzione del compilatore e la sua importanza per il programmatore.

Transcript:

I caratteri e le stringhe Ver. 2.4 2010 - Claudio Fornaro - Corso di programmazione in C 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 Code for Information Interchange) è una tabella che elenca le corrispondenze tra simboli grafici e numeri (es. A 65, B 66) I numeri del Codice ASCII standard sono a 7 bit 2 7 =128 caratteri diversi Curiosità: il codice ASCII delle cifre 0-9 si può ottenere dal corrispondente valore in BCD facendolo precedere dal valore 011: 7 = 0111, 0110111 = 55 (codice ASCII di 7) 2 Il codice ASCII standard 127 123 122 z 97 a 96 91 90 Z 65 A 64 58 57 9 48 0 47 33 32 31 0 Altri caratteri Lettere minuscole (a-z) Altri caratteri Lettere maiuscole (A-Z) Altri caratteri Cifre (0-9) Altri caratteri Carattere SPAZIO Caratteri di controllo 3 Il codice ASCII standard Contiene i 95 caratteri di base (es. non le lettere accentate) Ha 4 sezioni importanti: Spazio (è il carattere visibile di codice più basso) Cifre (0-9 in ordine crescente) Maiuscole (A-Z in ordine cresc.) Minuscole (a-z in ordine cresc.) Le 4 sezioni sono separate da altri caratteri generici (punteggiatura, simboli matematici, ecc.) Alcuni caratteri speciali (caratteri di controllo) non vengono visualizzati, ma producono un effetto (es. inserire un ritorno a capo, beep) 4

Il codice ASCII standard 5 Il codice ASCII esteso 6 Char Dec Oct Hex Char Dec Oct Hex Char Dec Oct Hex Char Dec Oct Hex (nul) 0 0000 0x00 (sp) 32 0040 0x20 @ 64 0100 0x40 ` 96 0140 0x60 (soh) 1 0001 0x01! 33 0041 0x21 A 65 0101 0x41 a 97 0141 0x61 (stx) 2 0002 0x02 " 34 0042 0x22 B 66 0102 0x42 b 98 0142 0x62 (etx) 3 0003 0x03 # 35 0043 0x23 C 67 0103 0x43 c 99 0143 0x63 (eot) 4 0004 0x04 $ 36 0044 0x24 D 68 0104 0x44 d 100 0144 0x64 (enq) 5 0005 0x05 % 37 0045 0x25 E 69 0105 0x45 e 101 0145 0x65 (ack) 6 0006 0x06 & 38 0046 0x26 F 70 0106 0x46 f 102 0146 0x66 (bel) 7 0007 0x07 ' 39 0047 0x27 G 71 0107 0x47 g 103 0147 0x67 (bs) 8 0010 0x08 ( 40 0050 0x28 H 72 0110 0x48 h 104 0150 0x68 (ht) 9 0011 0x09 ) 41 0051 0x29 I 73 0111 0x49 i 105 0151 0x69 (nl) 10 0012 0x0a * 42 0052 0x2a J 74 0112 0x4a j 106 0152 0x6a (vt) 11 0013 0x0b + 43 0053 0x2b K 75 0113 0x4b k 107 0153 0x6b (ff) 12 0014 0x0c, 44 0054 0x2c L 76 0114 0x4c l 108 0154 0x6c (cr) 13 0015 0x0d - 45 0055 0x2d M 77 0115 0x4d m 109 0155 0x6d (so) 14 0016 0x0e. 46 0056 0x2e N 78 0116 0x4e n 110 0156 0x6e (si) 15 0017 0x0f / 47 0057 0x2f O 79 0117 0x4f o 111 0157 0x6f (dle) 16 0020 0x10 0 48 0060 0x30 P 80 0120 0x50 p 112 0160 0x70 (dc1) 17 0021 0x11 1 49 0061 0x31 Q 81 0121 0x51 q 113 0161 0x71 (dc2) 18 0022 0x12 2 50 0062 0x32 R 82 0122 0x52 r 114 0162 0x72 (dc3) 19 0023 0x13 3 51 0063 0x33 S 83 0123 0x53 s 115 0163 0x73 (dc4) 20 0024 0x14 4 52 0064 0x34 T 84 0124 0x54 t 116 0164 0x74 (nak) 21 0025 0x15 5 53 0065 0x35 U 85 0125 0x55 u 117 0165 0x75 (syn) 22 0026 0x16 6 54 0066 0x36 V 86 0126 0x56 v 118 0166 0x76 (etb) 23 0027 0x17 7 55 0067 0x37 W 87 0127 0x57 w 119 0167 0x77 (can) 24 0030 0x18 8 56 0070 0x38 X 88 0130 0x58 x 120 0170 0x78 (em) 25 0031 0x19 9 57 0071 0x39 Y 89 0131 0x59 y 121 0171 0x79 (sub) 26 0032 0x1a : 58 0072 0x3a Z 90 0132 0x5a z 122 0172 0x7a (esc) 27 0033 0x1b ; 59 0073 0x3b [ 91 0133 0x5b { 123 0173 0x7b (fs) 28 0034 0x1c < 60 0074 0x3c \ 92 0134 0x5c 124 0174 0x7c (gs) 29 0035 0x1d = 61 0075 0x3d ] 93 0135 0x5d } 125 0175 0x7d (rs) 30 0036 0x1e > 62 0076 0x3e ^ 94 0136 0x5e ~ 126 0176 0x7e (us) 31 0037 0x1f? 63 0077 0x3f _ 95 0137 0x5f (del) 127 0177 0x7f Poiché i bit vengono considerati a gruppi di 8 (byte) e non di 7, il codice ASCII viene modificato così da usare valori di 8 bit, questo raddoppia il numero di codici utilizzabili che passano a 256 I 128 caratteri aggiuntivi (con codice da 128 a 255) vengono utilizzati per altri simboli grafici meno comuni (es. le lettere accentate, à, ë, î) La parte aggiunta non è standard ed è diversa per ciascun sistema operativo Può essere diversa anche nello stesso sistema operativo a seconda della lingua Caratteri 7 Caratteri 8 Per memorizzare un carattere, il C memorizza il numero intero corrispondente al suo codice ASCII ('A' equivale a 65, '0' a 48, ecc.) Costanti carattere: indicate tra apici singoli ('A'), oppure indicandone il codice ASCII in: decimale: 65 ottale: '\101' esadecimale: '\0x41' Le costanti di tipo carattere vengono anche chiamate letterali carattere (character literal ) Essendo numeri interi, i caratteri possono essere usati nelle operazioni: x = c '0'; se c contiene il codice ASCII di una cifra, c '0' ne è il valore corrispondente Esempio Se c='7', allora '7' '0' viene valutato come 55 48, cioè il valore 7 (il risultato è di tipo int per effetto delle promozioni integrali)

Caratteri 9 Caratteri 10 Variabili carattere: variabili di tipo intero su 8 bit, sono definite di tipo char char y; definizione y = 'A'; assegnazione con carattere y = 65; ass. con cod. ASCII decimale y = '\101'; con cod. ASCII ottale y = '\0x41'; con cod. ASCII esadecim. Tutte le assegnazioni precedenti sono equivalenti ed assegnano il carattere 'A' (codice ASCII 65) alla variabile y y può essere usata sia come numero (65) sia come carattere ('A'): printf("%c ha valore %d\n", y, y); dove la specifica %c serve per visualizzare il simbolo corrispondente ad un codice ASCII, mentre la specifica %d visualizza un numero intero, questo visualizza: A ha valore 65 Caratteri 11 Caratteri 12 Alcuni caratteri speciali si possono anche ottenere utilizzando le sequenze di escape: Caratteri speciali: \' \" \? \\ Ad es. per introdurre l apice in una variabile char si deve scrivere '\'' dove il carattere di escape \ permette di considerare l apice che lo segue come carattere normale e non come delimitatore di una costante di tipo carattere char apice = '\''; Poiché il carattere \ ha un significato speciale, quando esso serve come carattere normale deve essere raddoppiato (anche nelle stringhe) char backslash = '\\'; I caratteri corrispondenti ai caratteri di controllo del codice ASCII non hanno un aspetto grafico, ma quando vengono visualizzati producono un effetto quale un beep, un ritorno a capo, ecc. Si possono facilmente ottenere mediante sequenze di escape (oppure si indicano con il codice ASCII in decimale, ottale o esadec.): \a - quando viene visualizzato fa emettere un beep \n - corrisponde al carattere new line (10) \r - corrisponde al carattere carriage return (13) \t - corrisponde al carattere Tab char beep = '\a';

Stringhe 13 Stringhe 14 Sono vettori di char terminati da un carattere di codice ASCII pari a 0 (il terminatore non è il carattere '0' che ha valore 48 nel codice ASCII, ma il carattere '\0') C I A O\0 I L R E! \0 67 73 65 79 0 73 74 32 82 69 33 0 Le terminate da uno 0 vengono anche dette stringhe ASCIIZ, il linguaggio C ha solo questo tipo di stringhe Stringhe costanti Sono sequenze di caratteri racchiuse da doppi apici, la stringa "ciao ciao" è composta da 9+1 caratteri, l ultimo è '\0' Per includere in una stringa i caratteri \ e " è necessario precederli dal carattere di escape \ "vero\\falso" memorizza: vero\falso "premi \"invio\" per terminare" memorizza: premi "invio" per terminare Una stringa costante viene anche chiamata letterale stringa (string literal ) Stringhe 15 Stringhe 16 Più stringhe costanti consecutive (separate da nulla, spazi, Tab o ritorni a capo) vengono concatenate dal compilatore in una sola: "ciao" "ciao" "ciao" "ciao" viene memorizzata come fosse scritta così: "ciaociaociaociao" (17 caratteri) Una stringa costante è un vettore di char di classe di allocazione static (quindi non modificabile) inizializzato con i caratteri dati Le classi di allocazione sono descritte in altro set di slide (puntatori) Variabili stringa Sono vettori di char di dim. fissa, l ultimo carattere deve essere il terminatore '\0' char nome[15]; definisce una variabile stringa composta di 15 char, può contenere fino a 14 caratteri utili (deve esserci spazio per il carattere '\0') Il 1 o carattere è nome[0], il 2 o nome[1], ecc. Il terminatore permette di occupare solo parzialmente una stringa (lo spazio relativo ai restanti caratteri esiste ma è inutilizzato) nome: C I A O\0??????????

Stringhe 17 Stringhe 18 La lunghezza di una stringa è il numero di caratteri contenuti (fino al '\0' escluso), non la sua capienza (nell es. precedente è 4) Si noti la differenza tra: 'a' il carattere 'a' (il numero 97) "a" la stringa contenente 'a' e '\0' Essendo una stringa un vettore di char, il nome di una stringa viene usato dal compilatore come sinonimo dell indirizzo di memoria del primo carattere Si possono inizializzare le variabili stringa in 2 modi equivalenti: char s[20]="ciao"; char s[20]={'c','i','a','o'}; Il carattere di posizione 4 (il 5 o ) è '\0' in entrambi i casi: infatti, essendo vettori, se l inizializzazione non riempie completamente la stringa, i caratteri successivi a quelli indicati sono tutti 0 (cioè '\0') I singoli elementi della stringa sono caratteri: s[2] vale 'a' s[0] = 'M'; modifica s in "Miao" Per assegnare una stringa NON si può scrivere s="ciao" ma serve una funzione I/O di caratteri <stdio.h> 19 I/O di caratteri <stdio.h> 20 printf("%c", varchar); manda in output il carattere scanf("%c", &varchar); legge 1 carattere (anche spazi e ritorni a capo) e lo mette in varchar, se viene indicata un ampiezza (es. %4c) legge esattamente quel numero di caratteri (anche spazi) e li assegna alla STRINGA indicata come parametro, senza aggiungere il '\0': scanf("%4c", varstringa); per saltare gli spazi iniziali si usi %1s putchar(varchar); manda in output il carattere varint = getchar(); getchar restituisce il carattere letto o la costante EOF per segnalare la fine dell input, varint deve essere di tipo int per potervi memorizzare anche EOF che è di tipo int. EOF è una costante simbolica definita in <stdio.h> con una #define, in genere vale 1

I/O di stringhe <stdio.h> 21 I/O di stringhe <stdio.h> 22 puts(varstringa); visualizza varstringa e aggiunge un '\n' alla fine (cioè va a capo). Dà EOF in caso di errore gets(varstringa); legge da tastiera tutta la stringa in input (spazi e Tab inclusi) fino al ritorno a capo incluso, la mette in varstringa senza il '\n', aggiunge '\0' alla fine. Dà NULL in caso di errore o di fine file printf("%s", varstringa); %s visualizza una stringa (che può contenere spazi, Tab, '\n', ecc.) fino al '\0' o al numero di caratteri indicato (es. %4s) scanf("%s", varstringa); SENZA & %s salta i white space (spazi, Tab, '\n', ecc.) iniziali e legge solo fino al primo white space (che lascia nel buffer), per leggere il primo carattere saltando i white space iniziali si usi %1s (richiede una variabile stringa) Un qualsiasi white space nella stringa di formato richiede che tutti i white space in quel punto dell input vengano saltati (quindi anche il carattere '\n' non viene considerato come carattere ordinario: non indica affatto alla scanf che deve attendere un ritorno a capo) I/O di stringhe <stdio.h> 23 I/O di stringhe <stdio.h> 24 Una specifica di conversione della forma %[abc] equivale a una %s salvo che: si ferma solo quando trova un carattere diverso da quelli dell insieme (scanset ) indicati tra le parentesi quadre (notare che lo scanset può includere lo spazio e il ritorno a capo) non salta i white-space iniziali Esempio scanf("%[abcfrq]", s); Se si dà in input abbaino, s contiene abba mentre ino resta disponibile per le successive funzioni di input Per specificare il complementare di uno scanset si usa il carattere ^ come segue: %[^abc] la lettura si ferma solo quando trova un carattere uguale a uno di quelli indicati tra le parentesi quadre. Se si dà in input albero alla funzione: scanf("%[^nmrst]", s); s contiene albe mentre ro resta disponibile per le successive funzioni di input

I/O di stringhe <stdio.h> 25 I/O di stringhe <stdio.h> 26 Per leggere una stringa fino a fine riga utilizzando una scanf si può quindi utilizzare la specifica %[^\n]%*c che legge tutti i caratteri che trova finché non incontra il ritorno a capo '\n', la parte %*c legge e scarta (non memorizza) il ritorno a capo Se si danno in input più caratteri di quelli che la variabile stringa può contenere, si sfora la stringa (buffer overflow ) e si possono avere comportamenti anomali (vedere i vettori) Soluzione non preventiva: richiedere al compilatore di aggiungere controlli opportuni (il linguaggio C standard non li prevede) Soluzioni preventive: Non si può evitare il problema della gets, ma questa può essere sostituita da una fgets nella quale invece si può specificare il numero massimo di caratteri da leggere (vedere slide sui file) Se si usa una scanf, si può specificare la dimensione massima del campo in input: es. %20s Ritorno a capo 27 Problemi di I/O 28 A seconda del sistema operativo utilizzato, il ritorno a capo è in realtà costituito da una sequenza di uno o più caratteri: MS-DOS/Win: CR+LF (codici ASCII 13 e 10: \r\n) Unix/Linux: LF (codice 10: \n) Le funzioni di I/O considerano in carattere \n indicato nel codice C come riferimento generico al ritorno a capo : in input la sequenza di ritorno a capo viene trasformata in \n in output il carattere \n viene sostituito con la sequenza propria del sistema operativo scanf("%d",&x); gets(s); Si supponga di inserire un valore e premere Invio: la scanf legge il valore, ma il ritorno a capo \n (prodotto dal tasto Invio) viene prelevato (e scartato) dalla gets che quindi non aspetta altro input e mette in s una stringa vuota (cioè un carattere \0 ): la gets sembra essere saltata Bisogna quindi consumare il ritorno a capo dato dopo l introduzione del numero da assegnare a x

Problemi di I/O Soluzioni possibili: 1. si aggiunge dopo la specifica %d la specifica %*c che legge e scarta il successivo carattere in input (il ritorno a capo): scanf("%d%*c",&x); 2. si previene il problema evitando di mescolare scanf e gets: si usano solo scanf: risolve il problema perché le specifiche (esclusa %c) scartano i white space iniziali (tra cui il \n ) si usano solo gets: risolve il problema perché la funzione gets legge una riga e scarta il ritorno a capo \n alla fine della riga stessa 3. alcuni compilatori permettono di svuotare i buffer di input con fflush(stdin) tra la scanf e la gets, ma fflush su stdin non è standard 29 Problemi di I/O Si chiede l introduzione di due caratteri dalla tastiera (due input diversi) mediante il codice: puts("inserisci 1o carattere: "); scanf("%c", &c); puts("inserisci 2o carattere: "); scanf("%c", &d); la prima scanf preleva il carattere per c, ma lascia nel buffer della tastiera il ritorno a capo e questo viene prelevato dalla seconda per d, quindi a d viene assegnato il codice del ritorno a capo (in realtà viene assegnato il secondo dei due se il ritorno a capo è la coppia CR+LF) 30 Problemi di I/O Soluzioni possibili: 1. nella prima scanf si usa %c%*c che legge ed elimina il \n 2. si sostituisce la 2 a scanf con: scanf("%1s",s); d = s[0]; avendo definito: char s[2]; Questo funziona in quanto la specifica %s legge caratteri dopo aver saltato i white space (anche eventuali \n ), in questo caso deve prelevare un solo carattere. Attenzione che %1s produce una stringa (e non un carattere) e questa è composta dal carattere letto e dal carattere di terminazione '\0' 31 Libreria caratteri <ctype.h> Le seguenti funzioni danno risultato vero (valore!=0) se il carattere c è del tipo indicato isdigit(c) cifra decimale isalpha(c) lettera isalnum(c) carattere alfanumerico isxdigit(c) cifra esadecimale islower(c) lettera minuscola isupper(c) lettera maiuscola iscntrl(c) carattere di controllo isspace(c) white space (' ','\t','\n',...) isprint(c) char stampabile, incluso lo spazio isgraph(c) char stampabile, escluso lo spazio ispunct(c) stampabile, no spazio, no alfanum if (isdigit(c)) printf("e una cifra"); 32

Libreria caratteri <ctype.h> 33 Funzioni su stringhe <stdlib.h> 34 Le seguenti funzioni producono un valore int contenente il codice ASCII del carattere c eventualmente convertito, se possibile: toupper(c) in maiuscolo tolower(c) in minuscolo Altrimenti il valore prodotto resta c (invariato) Se si vuole convertire in maiuscolo/minuscolo tutta una stringa è necessario applicare la funzione a ciascuno dei caratteri: for (i=0; i<strlen(s); i++) s[i] = (char)toupper(s[i]); notare il cast: toupper produce un int varint = atoi(stringa) converte stringa in int x=atoi("123"); 123 in complem. a 2 varlong = atol(stringa) converte stringa in long y=atol("123"); 123 in complem. a 2 vardouble = atof(stringa) converte stringa in double z=atof("1.23e5"); 1.23 10 5 in floating point Confronto tra stringhe 35 Libreria stringhe <string.h> 36 Avviene confrontando i caratteri di posizione corrispondente delle due stringhe secondo i loro codici ASCII ( < significa precede ) cane < gatto cane > Gatto cane < cavallo cavallo < cavallone cavallo < cavallo cavallo < cavallo 21 > 123 Attenzione! Lunghezza di una stringa strlen(str) restituisce un valore intero pari alla lunghezza di str ('\0' escluso), il tipo restituito non è int, ma size_t: si tratta di un tipo adatto a contenere la lunghezza di una stringa sul compilatore in uso (su alcuni potrebbe essere equivalente ad un int, su altri ad un long) int l; char s[30]="ciao"; l=strlen(s); l vale 4

Libreria stringhe <string.h> 37 Libreria stringhe <string.h> 38 Copia di una stringa strcpy(str1,str2) copia str2 in str1 ('\0' incluso) Il modo corretto di cambiare valore ad una variabile stringa è dunque il seguente: char s[30]; strcpy(s, "ciao"); Non è invece corretto scrivere: s = "ciao"; Solo nell inizializzazione si può scrivere: char s[30] = "ciao"; Copia parziale di una stringa strncpy(str1,str2,n) copia i primi n caratteri di str2 in str1 (quelli presenti se è più corta), non aggiunge il '\0' finale se non è tra i primi n caratteri di str2 char s[30]="hello"; strncpy(s, "ciao", 4); "ciaoo" strncpy(s, "hi", 2); "hiaoo" Mentre char s[30]="buongiorno"; strcpy(s, "ciao"); "ciao" Libreria stringhe <string.h> 39 Libreria stringhe <string.h> 40 Concatenazione di stringhe strcat(str1,str2) concatena str2 alla fine di str1 ('\0' incluso) char s[30]="dove", t[30]=" vai"; strcat(s,t); s vale "dove vai" strncat(str1,str2,n) concatena i primi n caratteri di str2 alla fine di str1 (quelli presenti se è più corta), non aggiunge il '\0' finale se non è tra i primi n caratteri di str2 Confronto tra stringhe strcmp(str1,str2) confronta str1 e str2 in base ai codici ASCII, restituisce un intero: minore di 0 se str1<str2 uguale a 0 se str1=str2 maggiore di 0 se str1 > str2 strncmp(str1,str2,n) confronta i primi n caratteri di str1 e str2 (quelli presenti se almeno una è più corta)

Libreria stringhe <string.h> Ricerca in stringhe strchr(str, carattere) cerca carattere in str a partire dal suo primo carattere all ultimo, dà NULL se non lo trova if (strchr(s, 'z')!= NULL) printf("trovata una z!"); strrchr(str, carattere) cerca carattere in str a partire dal suo ultimo carattere al primo, dà NULL se non lo trova strstr(str1, str2) cerca str2 in str1, dà NULL se non la trova if (strstr(s, "ciao")!= NULL) printf("trovata stringa ciao!"); 41 Libreria stringhe <string.h> Ricerca in stringhe Le funzioni di ricerca (strchr, strrchr, strstr, strtok, ecc.) in realtà restituiscono l indirizzo di memoria ( il puntatore ) a quanto trovato e NULL se non lo trovano 42 I/O da/su stringhe <stdio.h> sscanf(stringa, formato, variabili); identica alla scanf, ma preleva da stringa i caratteri come se provenissero dalla tastiera) Esempio se stg contiene 12 ciao 23.2, la funzione: sscanf(stg, "%d%s%f", &a, s, &b); legge e assegna 12 ad a, ciao ad s, 23.2 a b Utile per analizzare (parsing) una riga di cui non è noto a priori il numero di elementi che la compongono (per sapere quanti sono i valori letti si valuta il valore restituito dalla sscanf) 43 I/O da/su stringhe <stdio.h> Esempio gets(s); if (sscanf(s,"%d%d",&a,&b)==2)... s abcd... s non contiene valori numerici, nessuna delle variabili viene assegnata e la sscanf restituisce 0 s 12 abcd... s contiene 1 solo valore, questo viene assegnato ad a (b resta invariato) e la sscanf restituisce 1, s 12 23 abcd... s contiene 2 valori, questi sono assegnati ad a e a b e la sscanf restituisce 2 s 12 23 34 abcd... s contiene più di 2 valori, i primi due sono assegnati ad a e a b, i restanti non vengono considerati e la sscanf restituisce 2 44

I/O da/su stringhe <stdio.h> sprintf(stringa, formato, variabili); identica alla printf, ma scrive in stringa i caratteri che la printf manderebbe su stdout (video) Esempio se g contiene 23 e m contiene febbraio sprintf(str, "Il %d %s", g, m); mette in str: Il 23 febbraio Utile per assemblare una stringa composta da parti di tipo diverso provenienti da variabili 45 Altre funzioni di parsing Oltre alla sscanf, per la suddivisione (parsing) di una stringa composta da più parti (token) si possono usare le seguenti funzioni (si rimanda ad altra documentazione per i dettagli, vedere bibliografia): In <string.h>: strspn, strcspn, strpbrk, strtok In <stdlib.h> (token di tipo numerico): strtod, strtol, strtoul 46 Vettori di stringhe Una matrice di char è un vettore di stringhe: char str[4][20]={"uno", "due"}; definisce un vettore di 4 stringhe di 20 char (i caratteri sono inizializzati a \0 se almeno parte della matrice viene inizializzata) Le 4 stringhe sono identificate da str[i] e utilizzabili come normali stringhe: scanf("%s", str[2]); es."ciao" str[3][0]='x'; str: str[0] u n o \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 str[1] d u e \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 str[2] c i a o \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 str[3] X \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 47 Vettori di stringhe Per memorizzare una sequenza di N stringhe di lunghezza LEN in un vettore di stringhe si può utilizzare il metodo seguente: char str[n][len]; for (i=0; i<n; i++) gets(str[i]); 48

Esercizi 49 Esercizi 50 1. Scrivere un programma che date due stringhe in input stampi la più lunga. La prima se sono di uguale lunghezza. 2. Scrivere un programma che date due stringhe in input stampi la maggiore. 3. Scrivere un programma che chieda in input una stringa e calcoli da quanti caratteri è composta (senza usare la funzione strlen ma cercando il carattere '\0') 4. Scrivere un programma che data una stringa in input, la converta tutta in maiuscolo. 5. Scrivere un programma che data una stringa in input verifichi se essa contiene almeno una A tra i primi 10 caratteri. 6. Scrivere un programma che richieda in input una stringa e conti quante cifre essa contiene. Esempio Ciao2004! C6? deve dare 5. 7. Scrivere un programma che richieda in input una stringa e conti di quante lettere maiuscole, lettere minuscole, cifre e altri caratteri è composta Esempio Ciao2004! C6? deve dare: maiuscole:2, minuscole: 3, cifre: 5, altri: 3. Esercizi 51 Esercizi 52 8. Scrivere un programma che date in input due stringhe di lunghezza diversa indichi se la più corta è contenuta solo una volta nella più lunga. 9. Scrivere un programma che verifichi se la stringa data in input è palindroma o no ( kayak, otto, elle, anilina ). 10. Scrivere un programma che verifichi se la stringa data è composta di due parti uguali, trascurando il carattere centrale se la lunghezza è dispari (es. CiaoCiao, CiaoXCiao ). 11. Un immagine è composta da 256x256 punti di colore bianco o nero ed è rappresentata da una matrice di caratteri. Ogni elemento della matrice rappresenta un puntino e vale: 1 per rappresentare un punto nero 0 per rappresentare un punto bianco. Si scriva un programma che codifichi l immagine sostituendo, per ciascuna riga di punti, le sequenze consecutive dello stesso carattere ( 0 o 1 ) con il carattere stesso seguito dal numero delle sue ripetizioni. Si ripeta codificando le colonne.

Esercizi 53 Homework 2 54 Continuazione: Ad es. l immagine seguente (solo 6x3): 0000000000 (ci sono 10 zeri) 0111111100 (1 zero, 7 uno, 2 zeri) 0100000100 (1 zero, 1 uno, 5 zeri, 1 uno, 2 zeri) viene codificata per righe come segue: 0 10 0 1 1 7 0 2 0 1 1 1 0 5 1 1 0 2 e per colonne come segue: 0 3 0 1 1 2 0 1 1 1 0 1... Scrivere un programma che chieda all utente di inserire una frase (max 128 caratteri), conti quante sono le parole (sequenze di lettere dell alfabeto) che la compongono e la lunghezza media delle parole stesse. Esempio Se viene dato in input: Ieri... sono andato a mangiare all'una! il programma deve indicare che ci sono 7 parole e che la lunghezza media è 4.14 caratteri.