S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in...

46
1 Stringhe • dichiarazione e input/output • assegnamento e sottostringhe • concatenazione • confronto • array di puntatori a stringhe • input/output, analisi e conversione di caratteri • conversione da stringa a numero e viceversa

Transcript of S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in...

Page 1: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

1

Stringhe

• dichiarazione e input/output• assegnamento e sottostringhe• concatenazione• confronto• array di puntatori a stringhe• input/output, analisi e conversione di caratteri• conversione da stringa a numero e viceversa

Page 2: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

2

Stringhe

Una stringa è una sequenza di caratteri.

Esempi:

printf(“Sum = %d”, s);

#define ERR_PREFIX “***** Error - “

#define INSUFF_DATA “Insufficient data”

Page 3: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

3

Dichiarazione e inizializzazione

char str_var[30];

la variabile str_var può contenere una stringa contenenteun numero di caratteri compreso tra 0 e 29

char str[20] = “Initial value”;

I n i t i a l v a l u e \0

[0] [4] [9] [14] [19]

Page 4: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

4

Carattere nullo

Il carattere ‘\0’, chiamato carattere nullo, indica lafine della stringa.

A causa della presenza del carattere nullo, le stringhememorizzabili in un array di caratteri hanno come lunghezza massima la dimensione dell’array meno 1.

Le funzioni C per la manipolazione di stringhe ignorano il contenuto degli elementi che seguonoil carattere nullo.

Page 5: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

5

Array di stringhePoichè una stringa è un array di caratteri, un arraydi stringhe è un array bidimensionale di caratteri, incui ogni riga è una stringa.Es:.

#define NUM_PEOPLE 30#define NAME_LEN 25char names[NUM_PEOPLE][NAME_LEN];

char month[12][10] = {“January”, “February”,“March”, “April”, “May”, “June”, “July”,“August”, “September”, “October”, “November”,“December”};

Page 6: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

6

Input / Outputprintf(“Topic: %s\n”, str_var);

stampa i caratteri contenuti in str_var che precedonoil carattere nullo.

printf(“***%8s***\n”, “Short”);

stampa la stringa Short all’interno di un campo di 8 caratteri, giustificata a destra. se la dimensione del campo è troppo piccola per contenerela stringa, il campo viene esteso della quantità minimanecessaria per poter contenere la stringa.

Page 7: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

7

Input / Output

printf(“%-10s\n”, “String”);

stampa la stringa String all’interno di un campo di 10caratteri, giustificata a sinistra.

char name[NAME_LEN];

scanf(“%s”, name);

prende in input una stringa;poichè il passaggio di parametri di tipo array avvienepassando l’indirizzo del primo elemento dell’array,la variabile name non deve essere preceduta da &

Page 8: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

8

[0]

N a d i a \0

[4] [9] [14]

dati inseriti > Nadia spazi ignorati causa l’inserimento di \0

scanf(“%s”, name);

La scanf ignora spazi, return e tab iniziali; inserisce quindi i caratteri in celle consecutive; quando trova uno spazio (o return o tab) aggiunge ilcarattere nullo e termina la scansione dell’input.

Page 9: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

9

Input - esempiochar name[NAME_LEN];int age;

scanf(“%s%d”, name, &age);

> Nadia25

Se non separo i dati in input con spazi, la scanf non èin grado di separare i dati e inserisce la sequenza dicaratteri “Nadia25” nella stringa name:

N a d i a 2 5 \0name

age ??

Page 10: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

10

Input - esempiochar names[NUM_PEOPLE][NAME_LEN];int ages[NUM_PEOPLE];

for (i = 0; i < NUM_PEOPLE; i++) {scanf(“%s%d”, names[i], &ages[i]);printf(“%-35s %3d\n”, names[i], ages[i]);

}

riempie gli array contenenti nomi ed età di un insieme dipersone ed effettua l’eco dei dati inseriti.

Page 11: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

11

AssegnamentoUn nome di array senza indici rappresenta l’indirizzodel primo elemento dell’array.Tale indirizzo è costante e non può essere cambiatocon un assegnamento:

char str[15];

str = “Test string”; /* errore! */

viene segnalato un errore in fase di compilazione

Page 12: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

12

Assegnamento

La libreria string.h fornisce funzioni per operaresulle stringhe.

strcpy(str, “Test string”);

copia la stringa fornita come secondo argomentonel primo argomento.

T e s t s t r i n g \0str

Page 13: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

13

AssegnamentoLa prima stringa deve avere dimensione sufficiente acontenere la seconda stringa più il carattere nullo

strcpy(str, “A long test string”);

in questo caso i caratteri finali ‘i’, ‘n’, ‘g’ e ‘\0’ vengonomemorizzati in locazioni riservate ad altre variabili.

str A l o n g t e s t s t r

Page 14: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

14

AssegnamentoLa funzione strncpy permette di specificare il numerodi caratteri da copiare:

strncpy(str, “Test”, 15);

T e s t \0 \0 \0 \0 \0 \0 \0 \0 \0str \0 \0

Se la stringa sorgente è più corta del numero di caratterispecificato, i restanti caratteri vengono posti a nullo.

Page 15: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

15

AssegnamentoPer assegnare il massimo prefisso della stringa sorgentealla stringa destinazione si utilizzano le seguentiistruzioni:

strncpy(dest, source, dest_len - 1);dest[dest_len - 1] = ‘\0’;

Page 16: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

16

Prototipo di strcpy e strncpychar *strcpy(char *dest, char *source);char *strncpy(char *dest, char *source, size_t n);

Il valore di ritorno è la stringa contenuta in dest.

Il chiamante può ottenere il risultato in due modi:• può utilizzare il primo argomento • può utilizzare il valore di ritorno

Page 17: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

17

Sottostringhe - prefissi

Le funzioni strcpy e strncpy possono essere utilizzateper estrarre frammenti (sottostringhe) di una stringa.Es.: estrarre giorno, mese ed anno dalla stringa“27/09/1999”

I primi n caratteri di una stringa possono essere estrattimediante le seguenti istruzioni:

strncpy(result, source, n);result[n] = ‘\0’;

Page 18: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

18

Sottostringhe centraliUn nome di array senza indici rappresenta l’indirizzodel primo elemento dell’array.Per estrarre una sottostringa centrale che inizia alla posizione k (e di lunghezza n) forniamo a strncpy l’indirizzo dell’elemento di indice k:

strncpy(result, &source[k], n);result[n] = ‘\0’;

Page 19: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

19

Sottostringhe - suffissiPer estrarre la parte finale di una stringa, a partiredalla posizione k, utilizzo la seguente istruzione:

strcpy(result, &source[k]);

La funzione strcpy copia tutti i caratteri finchè nontrova (e copia) il carattere nullo.

Page 20: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

20

Sottostringhe - esempio

char date[11] = “15/01/2000”;char day[3], month[3], year[5];

strncpy(day, date, 2);day[2] = ‘\0’;

strncpy(month, &date[3], 2);month[2] = ‘\0’;

strcpy(year, &date[6]);

Estrazione di giorno, mese ed anno dalla data:

Page 21: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

21

Lunghezza e stringa vuotaLa lunghezza di una stringa è il numero di caratteriche precedono il carattere nullo.La funzione strlen restituisce la lunghezza della stringa.

char str[20] = “hello”;printf(“%d\n”, strlen(str));

La stringa vuota è una stringa di lunghezza 0; il primo carattere della stringa è il carattere nullo:

char empty_str[30] = ““;

Page 22: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

22

Concatenazione

Le funzioni strcat e strncat modificano il primo argomento aggiungendo tutta o parte della stringa fornita come secondo argomento.Le due funzioni assumono che il primo argomento abbia dimensione sufficiente a contenere i caratteri che vengono aggiunti.

Page 23: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

23

Concatenazione#define STRSIZ 15char f1[STRSIZ] = “John”, f2[STRSIZ] = “Jacqueline”,

last[STRSIZ] = “ Kennedy”;

strcat(f1, last);strcat(f2, last);

J o h n K e n n e d y \0

J a c q u e l i n e K e n n

f1

f2

i caratteri ‘e’, ‘d’, ‘y’ vengono posti all’inizio di last.

Page 24: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

24

Concatenazione - carattere nullo

La funzione strcat aggiunge un’intera stringa, comprensiva del carattere nullo.

La funzione strncat aggiunge il carattere nullo soloc’è un carattere nullo tra gli n caratteri copiati.

Page 25: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

25

if (strlen(s1) + strlen(s2) < STRSIZ) {strcat(s1, s2);

} else {strncat(s1, s2, STRSIZ - strlen(s1) - 1);s1[STRSIZ -1] = ‘\0’;

}

Se possibile viene effettuata la concatenazione di s1 ed s2;se lo spazio non è sufficiente, viene aggiunto il massimoprefisso di s2 che non causa overflow:

Siano s1 ed s2 due stringhe di lunghezza STRSIZ:

char s1[STRSIZ], s2[STRSIZ];

Page 26: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

26

Punti critici nella manipolazione distringhe

• la dimensione del parametro di output è sufficiente a contenere la stringa che stiamo creando?

• la stringa che stiamo creando termina con ‘\0’?

Page 27: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

27

Differenza tra caratteri e stringhe

Il carattere ‘b’ non è un argomento valido per unafunzione che richiede una stringa (es.: strcat, strcpy, ...)

b carattere ‘b’

b \0 stringa “b”

Page 28: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

28

Input di una linea di testoLa funzione scanf utilizza gli spazi come delimitatoridella fine di una stringa.La funzione gets permette di prendere in input un’interalinea di testo (fino al carattere return):

char line[80];printf(“> “);gets(line, 80);

> Short line.

S h o r t l i n e . \0

Page 29: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

29

Confronto di stringhestr1 < str2

se str1 e str2 sono stringhe, la condizione è vera se la locazione contenente il primo elemento di str1 precedela locazione contenente il primo elemento di str2.

La funzione di libreria strcmp effettua il confronto di 2 stringhe:strcmp(str1, str2) ritorna un valore negativo se str1 è minore di str20 se str1 è uguale ad str2un valore positivo se str1 è maggiore di str2

Page 30: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

30

Ordinamento di stringhe1. se i primi n caratteri di str1 ed str2 sono uguali e i caratteri in posizione n sono diversi, allora str1 è minore di str2 se str1[n] < str2[n] es.: thrill è minore di throw

2. se str1 è più corta di str2 e tutti i caratteri di str1 sono uguali ai corrispondenti caratteri di str2, allora str1 è minore di str2 es.: joy è minore di joyous

Page 31: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

31

Il confronto tra stringhe è utile per ordinare un elencodi stringhe (es. con il selection sort):

Confronto (nella funzione get_min_range)

tra numeri

if (list[i] < list[first]) ...

tra stringhe

if (strcmp(list[i], list[first]) < 0) ...

Page 32: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

32

Scambio di elementi

tra numeri

temp = list[index_of_min];list[index_of_min] = list[fill];list[fill] = temp;

tra stringhe

strcpy(temp, list[index_of_min]);strcpy(list[index_of_min], list[fill]);strcpy(list[fill], temp);

Page 33: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

33

Input di stringhe controllato dasentinella

scanf(“%s”, word);while (strcmp(word, SENT) != 0) {

/* process word */

scanf(“%s”, word);}

Page 34: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

34

Array di puntatoriLo scambio di stringhe è un’operazione costosa perchè richiede 3 operazioni di copiatura di stringhe.In questo caso è conveniente utilizzare un arrayausiliario di puntatori a stringhe ed effettuare scambidi puntatori.

In aggiunta achar list[NUMELEM][STRSIZ];

si dichiara l’array di puntatorichar *alphap[NUMELEM];

Page 35: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

35

u l i p \0m a r i g or o s e \0p e t u n id a i s y \0l i l y \0

l

a

t\0

d

\0

alphap list

for (i = 0; i < NUMELEM; i++) printf(“%s\n”, alphap[i]);

Visualizzazione della lista ordinata:

L’array ausiliario di puntatori è utile per manteneredue diversi ordinamenti in una lista (es.: ordinedi registrazione e ordine alfabetico)

Page 36: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

36

Input/output di caratteriL’input di un carattere può essere effettuato neiseguenti modi:scanf(“%c”, ch);ch = getchar();

L’output di un carattere può essere effettuato neiseguenti modi:printf(“%c”, ‘a’);putchar(‘a’);

Page 37: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

37

Analisi di caratteriLa libreria ctype.h contiene le seguenti funzioni di analisi e conversione di caratteri:

isalpha vera se l’argomento è una letteraisdigit vera se l’argomento è una cifraislower vera se l’argomento è una lettera minuscolaisupper vera se l’argomento è una lettera maiuscolaispunct vera se l’argomento è un segno di punteggiaturaisspace vera se l’argomento è uno spazio, un return o un tab

Page 38: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

38

Conversione di caratteritolower converte la lettera maiuscola fornita come argomento nella corrispondente lettera minuscola e ritorna quest’ultima;se l’argomento non è una lettera maiuscola, ritornal’argomento invariato toupperanalogo da minuscola a maiuscola

if (islower(ch))printf(“Capital %c = %c\n”, ch,

toupper(ch));

Page 39: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

39

Conversione da numero a stringa

La funzione sprintf opera come la printf, ma anzichèvisualizzare l’output, lo inserisce nella stringa specificata:

int day = 30, month = 1, year = 1999;char s[100];

sprintf(s, “%d/%d/%d”, day, month, year);

3 0 / 1 / 1 9 9 9 \0s

Page 40: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

40

Conversione da stringa a numeroLa funzione sscanf opera come la scanf, ma prendel’input dalla stringa specificata come primo argomento:

int num;double val;char word[10];

sscanf(“ 5 1.23 hello”, “%d%lf%s”, &num, &val, word);

h e l l o \0

num 5 val 1.23

word

Page 41: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

41

/* returns the uppercase version of string s */char *toupper_str(char *s, int len){

char temp[100];int i;

for (i = 0; i < len; i++) temp[i] = toupper(s[i]);

return(temp);}

Errore: ritorno un indirizzo di un’area di memoria cheè stata deallocata al ritorno dalla funzione.Le funzioni che creano una nuova stringa devono avereun parametro in cui ritornare la stringa creata.

Page 42: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

42

Esempioint n;char ch, word[10];

scanf(“%c%d%s”, &ch, n, &word);

Errore: word è un puntatore al primo carattere di unastringa, quindi non occorre &;n è una variabile quindi deve essere preceduta da &;versione corretta:

scanf(“%c%d%s”, &ch, &n, word);

Page 43: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

43

Esempiochar first[8] = “long ”, last[8] = “beach”;

strcat(first, last);

Errore di overflow: first non ha dimensioni sufficienti a contenere la stringa “long beach”:

l o n g b e afirst

I restanti caratteri, ‘c’, ‘h’ e ‘\0’, vengono posti nellelocazioni di last.

Page 44: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

44

Esempiochar source[10] = “hello”, dest[10];

strncpy(dest, source, 4);

Errore: la dimensione di word non è sufficiente acontenere il carattere nullo;ho dimenticato di aggiungere il carattere nullo altermine di dest.

h e l l

source

dest

h e l l o \0

Page 45: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

45

Esempiochar second[10] = “tulip”,

first[10] = “lily”;

if (first < second)printf(“ok\n”);

Errore: l’operatore < non effettua il confronto trastringhe ma tra gli indirizzi di memoria dei primielementi delle stringhe; versione corretta:

if (strcmp(first, second) < 0)printf(“ok\n”);

Page 46: S tr in g h e - Scienza e Ingegneria - DISIbusi/lsbioinfo/9.strings.pdf · 5 A r r a y d i s tr in g h e P o ic h u n a s tr in g a u n a r r a y d i c a r a tte r i, u n a r r a

46

Esempiochar s1[10], s2[10], temp[10];

/* swap s1 and s2 */temp = s1;s1 = s2;s2 = temp;

Errore: l’assegnamento di stringhe va effettuato mediantestrcpy. Versione corretta:strcpy(temp, s1);strcpy(s1, s2);strcpy(s2, temp);