I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di...

58
I caratteri e le stringhe Ver. 2.4.2 © 2014 - Claudio Fornaro - Corso di programmazione in C

Transcript of I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di...

Page 1: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

I caratteri e le stringhe

Ver. 2.4.2

© 2014 - Claudio Fornaro - Corso di programmazione in C

Page 2: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

2

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 27=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)

Page 3: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

3

Il codice ASCII standardAltri caratteri

Lettere minuscole (a-z)

Altri caratteri

Lettere maiuscole (A-Z)

Altri caratteri

Cifre (0-9)

Altri caratteri

Carattere SPAZIO

Caratteri di controllo

127123122

9796

9190

6564

5857

4847

33

32

31

0

z

a

Z

A

9

0

Page 4: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

4

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)

Page 5: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

5

Il codice ASCII standardChar 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

Page 6: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

6

Il codice ASCII esteso 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

Page 7: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

7

Caratteri 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 )

Page 8: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

8

Caratteri 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 corrispondenteEsempioSe c='7', allora '7'–'0' viene valutato come 55–48, cioè il valore 7 (il risultato è di tipo int per effetto delle promozioni integrali)

Page 9: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

9

Caratteri Variabili carattere: variabili di tipo intero su

8 bit, sono definite di tipo charchar y; definizioney = 'A'; assegnazione con caratterey = 65; ass. con cod. ASCII decimaley = '\101'; con cod. ASCII ottaley = '\0x41'; con cod. ASCII esadecim.Tutte le assegnazioni precedenti sono equivalenti ed assegnano il carattere 'A'(codice ASCII 65) alla variabile y

Page 10: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

10

Caratteri 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

Page 11: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

11

Caratteri 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 caratterechar apice = '\'';

Poiché il carattere \ ha un significato speciale, quando esso serve come carattere normale deve essere raddoppiato (anche nelle stringhe)char backslash = '\\';

Page 12: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

12

Caratteri 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 Tabchar beep = '\a';

Page 13: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

13

Stringhe Sono vettori di char terminati dal carattere

null: quello di codice ASCII pari a 0 (non è il carattere '0' che ha valore 48 nel codice ASCII, ma il carattere ottale '\0')

Le stringhe terminate da uno 0 vengono anche dette stringhe ASCIIZ, il linguaggio C ha solo questo tipo di stringhe

C I A O\0

I L R E ! \0

67 73 65 79 0

73 74 32 82 69 33 0

Page 14: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

14

Stringhe costanti Stringhe costanti

Sono sequenze di char racchiuse da doppiapici, la stringa "ciao ciao" è composta da 9+1 caratteri, l’ultimo è '\0'Per includere in una stringa i caratteri \ e " è necessario precederli con il carattere escape \ "vero\\falso" memorizza: vero\falso "premi \"invio\" per terminare"

memorizza: premi "invio" per terminare Lo standard C89 chiama la stringa costante

letterale stringa (string literal ) e afferma che può contenere almeno 509 char

Page 15: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

15

Stringhe costanti 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 ha classe di allocazione static (le classi di allocazione sono descritte nel set di slide sui puntatori)

Page 16: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

16

Stringhe costanti Anche se un letterale stringa viene

normalmente considerato e usato come stringa costante, in realtà lo standard C89 non afferma che non possa essere modificato

Lo standard afferma invece che più letterali uguali possano essere memorizzati in un’unica copia e che la modifica di uno abbia un effetto indeterminato (spesso i compilatori hanno un’opzione per indicare se i letterali stringa possano essere modificati o no)puts("ciao");strlen("ciao");

C I A O\0

Page 17: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

17

Stringhe variabili Variabili stringa

Sono vettori di char di dimensione fissa (nota al compile-time), l’ultimo carattere deve essere il terminatore null '\0'char nome[15];definisce una variabile stringa composta di 15 char, ma può contenere fino a 14 caratteri utili perché deve esserci spazio per il carattere di terminazione null '\0'

Page 18: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

18

Stringhe variabili Come per i vettori, la dimensione (la

lunghezza massima) di una stringa viene di solito indicata con una #define

Se è richiesto che la stringa possa contenere esattamente un certo numero di caratteri utili, è nella definizione della stringa stessa che si somma 1 per contenere anche il carattere null#define MAXSTR 80char mystring[MAXSTR+1];

Page 19: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

19

Stringhe variabili Il terminatore permette di occupare solo

parzialmente una stringa (lo spazio relativo ai restanti caratteri esiste ma è inutilizzato)nome:

La lunghezza di una stringa è il numero di caratteri contenuti (fino al null escluso), non la sua dimensione (“capienza”), nell’esempio sopra è 4

C I A O\0 ? ? ? ? ? ? ? ? ? ?

Page 20: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

20

Stringhe variabili Essendo una stringa un vettore, i suoi elementi

si indicano con la notazione dei vettori:nome[0] è il 1o caratterenome[1] è il 2o carattereecc.

I singoli elementi della stringa sono caratteri, se la stringa s contiene "Ciao":s[2] vale 'a's[0] = 'M'; modifica s in "Miao"

Per assegnare una stringa NON si può scriveres="Ciao" ma è necessario usare una funzione (strcpy, vedere più avanti)

Page 21: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

21

Stringhe variabili Si possono inizializzare le variabili stringa in 2

modi equivalenti:char s[20]="Ciao";char s[20]={'C','i','a','o'};

s[4] è '\0' in entrambi i casi: essendo vettori, se l’inizializzazione non riempie del tutto la stringa, i caratteri successivi a quelli indicati sono tutti 0 (che è il valore di '\0')

Si noti che "Ciao" non è un letterale stringa in quanto non viene memorizzato come tale, ma i suoi caratteri vengono inseriti in s ed esistono solo lì

Page 22: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

22

Stringhe variabili 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

Per quanto non molto utile, anche un letterale stringa può essere indicizzato:hex="0123456789ABCDEF"[val_decim];printf("%d numer%c\n",a,"io"[a==1]);

Page 23: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

23

I/O di caratteri <stdio.h> printf("%c", varChar);

manda in output il carattere scanf("%c", &varChar);

legge 1 carattere (anche se è uno spazio o un ritorno 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 “ %c” o “%1s” (vedere più avanti)

Page 24: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

24

I/O di caratteri <stdio.h> 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

Page 25: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

25

I/O di stringhe <stdio.h> 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)

Page 26: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

26

I/O di stringhe <stdio.h> 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 “�%c” o %1s (richiede una variabile stringa)

Un qualsiasi white space nella stringa di formato richiede che tutti gli eventuali white space in quel punto dell’input vengano saltati (quindi '\n' non viene considerato come un ritorno a capo e non indica affatto alla scanfche deve attendere proprio un ritorno a capo)

Page 27: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

27

I/O di stringhe <stdio.h> 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 inizialiEsempioscanf("%[abcfrq]", s);Se si dà in input “abbaino”, s contiene “abba” mentre “ino” resta disponibile per le successive funzioni di input

Page 28: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

28

I/O di stringhe <stdio.h> 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

Page 29: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

29

I/O di stringhe <stdio.h> Per leggere una stringa fino a fine riga

utilizzando una scanf si può utilizzare“%[^\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

In un ciclo di lettura di righe, si può utilizzare“ %[^\n]” (spazio iniziale)che salta i white space iniziali per effetto dello spazio indicato come primo carattere e quindi consuma i precedenti '\n'

Page 30: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

30

I/O di stringhe <stdio.h> 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

Page 31: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

31

Ritorno a capo 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

Page 32: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

32

Problemi di I/O 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 inserito dal tasto Invio dopo l’introduzione del numero da assegnare a x

Page 33: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

33

Problemi di I/O Soluzioni possibili:

1. si aggiunge dopo la specifica %d la specifica %*cche legge e scarta il successivo carattere in input (il ritorno a capo): scanf("%d%*c",&x);

2. si aggiunge dopo la specifica %d uno spazio: "%d ", ma attenzione che un’eventuale printf tra le due appare eseguita dopo la gets

3. si evita di mescolare scanf e gets: si usano solo scanf: le specifiche (escluse %c e

gli scanset) scartano i white space iniziali (e ‘\n’) si usano solo gets: la gets legge una riga e

scarta il ‘\n’ alla fine della riga stessa4. alcuni compilatori permettono di svuotare i buffer di

input con fflush(stdin) tra la scanf e la gets, ma fflush su stdin non è standard

Page 34: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

34

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 scanfper d, quindi a d viene assegnato il codice del ritorno a capo

Page 35: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

35

Problemi di I/O Soluzioni possibili:

1. nella seconda scanf si usa “ %c” (spazio iniziale) 2. nella prima scanf si usa “%c%*c”3. si sostituisce la 2a scanf con:

scanf("%1s",s);d = s[0]; avendo definito: char s[2];Diversamente dalla specifica %c, la specifica %ssalta i white space iniziali (compresi eventuali ‘\n’), %1s indica che si deve prelevare un solo carattere.Attenzione che %1s produce una stringa: cioè memorizza il carattere letto e aggiunge il '\0', bisogna dimensionarla di almeno 2 caratteri

Page 36: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

36

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 alfanumif (isdigit(c)) printf("e’ una cifra");

Page 37: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

37

Libreria caratteri <ctype.h> Le seguenti funzioni producono un valore int

contenente il codice ASCII del carattere ceventualmente convertito, se possibile: toupper(c) in maiuscolo tolower(c) in minuscoloAltrimenti il valore prodotto resta c (invariato)

Se si vuole convertire in maiuscolo/minuscolo tutta una stringa è necessario applicare la funzione a ciascuno dei caratteri fino al '\0':for (i=0; s[i]!='\0'; i++)

s[i] = (char)toupper(s[i]);notare il cast: toupper produce un int

Page 38: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

38

Funzioni su stringhe <stdlib.h> varInt = atoi(stringa)

converte stringa in intx=atoi("123"); 123 in complem. a 2

varLong = atol(stringa)converte stringa in longy=atol("123"); 123 in complem. a 2

varDouble = atof(stringa)converte stringa in doublez=atof("1.23E5"); 1.23×105 in

floating point

Page 39: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

39

Confronto tra stringhe 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!

Page 40: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

40

Libreria stringhe <string.h>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

Page 41: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

41

Libreria stringhe <string.h>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";

Page 42: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

42

Libreria stringhe <string.h>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 str2char s[30]="hello";strncpy(s, "ciao", 4); "ciaoo" strncpy(s, "hi", 2); "hiaoo"

Mentrechar s[30]="buongiorno";strcpy(s, "ciao"); "ciao"

Page 43: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

43

Libreria stringhe <string.h>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 ncaratteri di str2

Page 44: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

44

Libreria stringhe <string.h>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)

Page 45: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

45

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 trovaif (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 trovaif (strstr(s, "ciao") != NULL)

printf("Trovata stringa ciao!");

Page 46: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

46

Libreria stringhe <string.h>Ricerca in stringhe Le funzioni di ricerca (strchr, strrchr, strstr, e altre presenti nella libreria standard come strtok, ecc.) in realtà restituiscono l’indirizzo di memoria (“il puntatore”) a quanto trovato e NULL se non lo trovano

Page 47: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

47

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)

Esempiose 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)

Page 48: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

48

I/O da/su stringhe <stdio.h> Esempiogets(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

Page 49: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

49

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), aggiunge il null finale

Esempiose g contiene 23 e m contiene “febbraio”sprintf(str, "Il %d %s", g, m);mette in str: “Il 23 febbraio\0”

Utile per assemblare una stringa composta da parti di tipo diverso provenienti da variabili

Page 50: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

50

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

Page 51: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

51

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';

u n o \0

d u estr[0]str[1]str[2]str[3]

str:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0

\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0

c i a o \0\0\0\0\0\0\0\0\0\0\0\0\0

X \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0

\0\0\0

\0\0\0

Page 52: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

52

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]);

Page 53: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

53

Esercizi1. 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 strlenma 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.

Page 54: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

54

Esercizi6. 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 è compostaEsempio“Ciao2004! C6?” deve dare: maiuscole:2, minuscole: 3, cifre: 5, altri: 3.

Page 55: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

55

Esercizi8. 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”).

Page 56: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

56

Esercizi11. 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.

Page 57: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

57

EserciziContinuazione:

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 100 1 1 7 0 20 1 1 1 0 5 1 1 0 2

e per colonne come segue:0 30 1 1 20 1 1 1 0 1. . .

Page 58: I caratteri e le stringhe - polito.it · 14. Stringhe costanti Stringhe costanti. Sono sequenze di charracchiuse da doppi apici, la stringa "ciao ciao"è composta da 9+1 caratteri,

58

Homework 2Scrivere 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.EsempioSe 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.