CARATTERI E CODICE ASCII › 2020 › 12 › gnan_stringhe.pdfCARATTERI E CODICE ASCII In C i...

55
CARATTERI E CODICE ASCII In C i caratteri sono gestiti mediante variabili di tipo char (interi a 8 bit). Ad ogni carattere corrisponde un codice numerico ASCII Ad esempio: • Le lettere minuscole dell’alfabeto hanno un codice che va da [97,122] • Le lettere maiuscole dell’alfabeto hanno un codice che va da [65, 90] #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void){ char c; srand48(time(NULL)); /*il numero intero estratto viene interpretato come codice ASCII */ c=lrand48()%(123-97)+97; //[97,122] printf("il numero estratto e' %d e il carattere associato e' %c\n",c,c); } ngnan$ ./ascii.x il numero estratto e' 108 e il carattere associato e' l Es. estrazione random di una lettera dell’alfabeto minuscola

Transcript of CARATTERI E CODICE ASCII › 2020 › 12 › gnan_stringhe.pdfCARATTERI E CODICE ASCII In C i...

  • CARATTERI E CODICE ASCIIIn C i caratteri sono gestiti mediante variabili di tipo char (interi a 8 bit). Ad ogni carattere corrisponde un codice numerico ASCII Ad esempio:

    • Le lettere minuscole dell’alfabeto hanno un codice che va da [97,122] • Le lettere maiuscole dell’alfabeto hanno un codice che va da [65, 90]

    #include #include #include

    int main(void){ char c; srand48(time(NULL)); /*il numero intero estratto viene interpretato come codice ASCII */ c=lrand48()%(123-97)+97; //[97,122] printf("il numero estratto e' %d e il carattere associato e' %c\n",c,c); }

    ngnan$ ./ascii.x il numero estratto e' 108 e il carattere associato e' l

    Es. estrazione random di una lettera dell’alfabeto minuscola

  • CARATTERI E CODICE ASCIIIn C i caratteri sono gestiti mediante variabili di tipo char (interi a 8 bit). Ad ogni carattere corrisponde un codice numerico ASCII Ad esempio:

    • Le lettere minuscole dell’alfabeto hanno un codice che va da [97,122] • Le lettere maiuscole dell’alfabeto hanno un codice che va da [65, 90] • I numeri da 0 a 9(caratteri) hanno un codice che va da [48, 57]

    #include #include #include

    int main(void){ /* notate gli apici! 7 senza apici è una costante numerica, 7 compreso tra apici diventa il carattere ‘7’ (ovvero quello con codice ASCII 55) */ char c='7'; printf("il carattere assegnato e' %c\n",c); printf("il codice associato al carattere e' %d\n",c); }

    ngnan$ ./ascii_num.x il carattere assegnato e' 7 il codice associato al carattere e' 55

    Es. assegnazione del carattere 7 alla variabile di tipo char c

  • CARATTERI E CODICE ASCIIIn C i caratteri sono gestiti mediante variabili di tipo char (interi a 8 bit). Ad ogni carattere corrisponde un codice numerico ASCII

    #include #include #include

    int main(void){ /* notate gli apici! 7 senza apici è una costante numerica, 7 compreso tra apici diventa il carattere ‘7’ (ovvero quello con codice ASCII 55) */ char c=7; printf("il carattere assegnato e' %c\n",c); printf("il codice associato al carattere e' %d\n",c); }

    ngnan$ ./ascii_num.x il carattere assegnato e' il codice associato al carattere e' 7

    dovreste sentire un suono quando eseguite il codice perche’ associato al codice ASCII 7 che e’ il carattere speciale BEL (bell)

    Ad esempio:

    • Le lettere minuscole dell’alfabeto hanno un codice che va da [97,122] • Le lettere maiuscole dell’alfabeto hanno un codice che va da [65, 90] • I numeri da 0 a 9(caratteri) hanno un codice che va da [48, 57]Es. assegnazione del codice ASCII 7 alla variabile di tipo char c

  • MANIPOLAZIONE DI STRINGHE

    char parola[5]0

    234

    1

    come facciamo ad inizializzare questo tipo di array?

    Una stringa e’ un array unidimensionale di caratteri (ossia variabili di tipo char) che termina con il carattere di fine stringa ‘\0’

  • \0

    WR

    YF

    0

    234

    1Es.1

    #include #include #include #define LEN 5 int main() {/*programma che inizializza una stringa e la stampa*/ char parola[LEN]; int i; srand48(time(NULL));

    for(i=0;i

  • \0

    CI

    OA

    0

    234

    1Es.2

    #include #define LEN 5 int main() {/*programma che inizializza una stringa e la stampa*/ char parola[LEN]; parola[0]='c'; parola[1]='i'; parola[2]='a'; parola[3]='o'; parola[4]='\0';

    printf("%s\n",parola); }

    ricordarsi, quando si stabilisce la lunghezza della stringa di contare una casella in piu’ per il carattere \0

    //carattere di fine stringa

    char parola[5] come facciamo ad inizializzare questo tipo di array?

    Una stringa e’ un array unidimensionale di caratteri (ossia variabili di tipo char) che termina con il carattere di fine stringa ‘\0’

    STRINGHE

    assegnazione di una serie di caratteri minuscoli che compongono la parola ciao all’array parola

  • \0

    CI

    OA

    0

    234

    1

    #include #define LEN 5 int main() {/*programma che inizializza una stringa e la stampa*/ char parola[LEN]; parola[0]='c'; parola[1]='i'; parola[2]='a'; parola[3]='o'; parola[4]='\0';

    printf("%s\n",parola); }

    OUTPUT

    ciao

    ricordarsi, quando si stabilisce la lunghezza della stringa di contare una casella in piu’ per il carattere \0

    char parola[5] come facciamo ad inizializzare questo tipo di array?

    STRINGHEUna stringa e’ un array unidimensionale di caratteri (ossia variabili di tipo char) che termina con il carattere di fine stringa ‘\0’

    Es.2 assegnazione di una serie di caratteri minuscoli che compongono la parola ciao all’array parola

  • Es.1#include #define LEN 20 int main() {/*programma che inizializza una stringa e la stampa*/ char parole[LEN]; parole[0]='c'; parole[1]='i'; parole[2]='a'; parole[3]='o'; parole[4]=' '; parole[5]='m'; parole[6]='o'; parole[7]='n'; parole[8]='d'; parole[9]='o'; parole[10]='\0'; printf("%s\n",parole); }

    Es.3

    //spazio tra due parole

    //carattere di fine stringa

    STRINGHELe stringhe prendono in considerazione sia gli spazi tra una parola e un’altra si il carattere speciale \0 (che non si vede) che termina la stringa

    assegnazione di due parole separate da uno spazio all’ array parole

  • Es.1#include #define LEN 20 int main() {/*programma che inizializza una stringa e la stampa*/ char parole[LEN]; parole[0]='c'; parole[1]='i'; parole[2]='a'; parole[3]='o'; parole[4]=' '; parole[5]='m'; parole[6]='o'; parole[7]='n'; parole[8]='d'; parole[9]='o'; parole[10]='\0'; printf("%s\n",parole); }

    OUTPUT

    ciao mondo

    STRINGHELe stringhe prendono in considerazione sia gli spazi tra una parola e un’altra si il carattere speciale \0 (che non si vede) che termina la stringa

    Es.3 assegnazione di due parole separate da uno spazio all’ array parole

  • Es.1#include #define LEN 9 int main() {/*programma che inizializza una stringa e la stampa*/ char parola1[LEN]; char parola2[LEN]; parola1[0]='c'; parola1[1]='i'; parola1[2]='a'; parola1[3]='o'; parola1[4]='\0';

    parola2[0]='m'; parola2[1]='o'; parola2[2]='n'; parola2[3]='d'; parola2[4]='o'; parola2[5]='\0'; printf("%s %s\n",parola1, parola2); }

    OUTPUT

    ciao mondo

    Se si usano due stringhe per due parole diverse lo spazio tra le due parole viene creato nel printf()

    STRINGHE

    Es.4 assegnazione di due parole agli array parola1 e parola2

    in questo caso lo spazio tra le due parole viene creato con il printf

  • Es.1#include #define LEN 9 int main() {/*programma che inizializza una stringa e la stampa*/ char parola1[LEN]; char parola2[LEN]; parola1[0]='c'; parola1[1]='i'; parola1[2]='a'; parola1[3]='o'; //parola1[4]=‘\0’; COMMENTO IL FINE PAROLA

    parola2[0]='m'; parola2[1]='o'; parola2[2]='n'; parola2[3]='d'; parola2[4]='o'; parola2[5]='\0'; printf("%s %s\n",parola1, parola2); }

    STRINGHEChe cosa succede se commento il carattere di fine stringa della prima stringa?

    Es.4 assegnazione di due parole agli array parola1 e parola2 in cui non viene assegnato il carattere di fine stringa a parola1

  • #include #define LEN 9 int main() {/*programma che inizializza una stringa e la stampa*/ char parola1[LEN]; char parola2[LEN]; parola1[0]='c'; parola1[1]='i'; parola1[2]='a'; parola1[3]='o'; //parola1[4]=‘\0’; COMMENTO IL FINE PAROLA

    parola2[0]='m'; parola2[1]='o'; parola2[2]='n'; parola2[3]='d'; parola2[4]='o'; parola2[5]='\0'; printf("%s %s\n",parola1, parola2); }

    OUTPUT

    ciao>Q? mondo

    ATTENZIONE!!!!

    STRINGHEChe cosa succede se commento il carattere di fine stringa della prima stringa?

    Es.4 assegnazione di due parole agli array parola1 e parola2 in cui non viene assegnato il carattere di fine stringa a parola1

  • #include #define LEN 9 int main() {/*programma che inizializza una stringa e la stampa*/ char parole[2][LEN];

    parole[0][0]='c'; parole[0][1]='i'; parole[0][2]='a'; parole[0][3]='o'; parole[0][4]='\0';

    parole[1][0]='m'; parole[1][1]='o'; parole[1][2]='n'; parole[1][3]='d'; parole[1][4]='o'; parole[1][5]='\0'; printf("%s %s\n",parole[0], parole[1]); }

    E’ possibile creare un array multidimensionale di stringhe ossia

    STRINGHE

    Es.5 assegnazione di due parole alla matrice parole

  • #include #define LEN 9 int main() {/*programma che inizializza una stringa e la stampa*/ char parole[2][LEN];

    parole[0][0]='c'; parole[0][1]='i'; parole[0][2]='a'; parole[0][3]='o'; parole[0][4]='\0';

    parole[1][0]='m'; parole[1][1]='o'; parole[1][2]='n'; parole[1][3]='d'; parole[1][4]='o'; parole[1][5]='\0'; printf("%s %s\n",parole[0], parole[1]); }

    0 2 3 41 5 6 7 8\0OAIC

    OD \0NOM01

    parole[0]

    parole[1]

    E’ possibile creare un array multidimensionale di stringhe ossia

    STRINGHE

    Es.5 assegnazione di due parole alla matrice parole

  • come facciamo ad inizializzare questo tipo di array? #include #define LEN 5 int main() {/*programma che inizializza una stringa e la stampa*/ char parola[LEN]={‘c','i','a','o','\0'}; printf("%s\n",parola); }

    char parola[5]

    0

    234

    1

    Es.6

    \0

    CI

    OA Es.7

    #include #define LEN 5 int main() {/*programma che inizializza una stringa e la stampa*/ char parola[LEN]=“ciao”;//in questo caso il carattere \0 non serve printf(“%s\n”,parola); }

    STRINGHE

  • Come per i normali array, anche per le stringhe il compilatore non va a controllare se il testo assegnato e’ entro i limiti dell’array in cui viene memorizzato (al massimo da un warning ma compila il programma)

    Es.8#include #define LEN 10 int main() {/*programma che inizializza una stringa e la stampa*/ char parola[LEN]=“Oggi e’ una bella giornata”; //La stringa associata a parola e’ piu’ lunga della lunghezza massima dell’array printf("%s\n",parola); }

    ngnan$ gcc stringa.c -o stringa.x stringa.c:4:20: warning: initializer-string for char array is too long char parole[LEN]="Oggi e' una bella giornata"; ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1 warning generated. nicogel:Desktop ngnan$ ./stringa.x Oggi e' un@|???

    durante la compilazione otterremo un warning

    STRINGHE

    assegnazione di una frase intera all’array parola

  • come facciamo ad inizializzare questo tipo di array?

    char parola[5]

    0

    234

    1

    \0

    CI

    OA

    Es.9 #include #define LEN 5 int main() { char parola[LEN]; printf(“Introduci una parola: ”); scanf(“%s”,parola);//parola contiene un indirizzo di memoria //non serve l’operatore & in scanf //non serve il carattere di fine stringa printf(“La parola introdotta e’ %s\n”,parola); }

    STRINGHE

    Se vogliamo prelevare da terminale un numero massimo di caratteri basta che modificare la stringa di formato di scanf aggiungendo tra % e s il n. di caratteri da leggere

    #include #define LEN 5 int main() { char parola[LEN]; printf(“Introduci una parola: ”); scanf(“%3s”,parola);//scanf preleva al massimo 3 caratteri da terminale printf(“La parola introdotta e’ %s\n”,parola); }

  • ATTENZIONE: Se inserisco una frase da terminale ad esempio di 2 parole, scanf riconosce la frase costituita da 2 stringhe differenti (appena incontra il primo spazio smette di memorizzare i caratteri nella prima stringa).

    Es.10#include #include #define LEN 30 int main() { char p1[LEN]; fprintf(stdout,"Introduci una frase: "); scanf("%s",p1); fprintf(stdout,"La frase memorizzata e' %s\n”,p1); }

    Output:ngnan$./scanf_strings.x Intorduci frase: ciao mondo La frase memorizzata e' ciao

    STRINGHE

  • ATTENZIONE: Se inserisco una frase da terminale ad esempio di 2 parole, scanf riconosce la frase costituita da 2 stringhe differenti (appena incontra il primo spazio smette di memorizzare i caratteri nella prima stringa).

    Es.10#include #include #define LEN 30 int main() { char p1[LEN],p2[LEN]; fprintf(stdout,"Introduci una frase: "); scanf("%s %s",p1,p2); fprintf(stdout,"La frase memorizzata e' %s %s\n”,p1,p2); }

    Output:ngnan$./scanf_strings.x Intorduci frase: ciao mondo La frase memorizzata e' ciao mondo

    STRINGHE

    la cosa si puo’ risolvere in questo modo (molto poco generale)

  • ATTENZIONE: Se inserisco una frase da terminale ad esempio di 2 parole, scanf riconosce la frase costituita da 2 stringhe differenti (appena incontra il primo spazio smette di memorizzare i caratteri nella prima stringa).

    Es.10#include #include #define LEN 30 int main() { char p1[LEN]; int i=-1; fprintf(stdout,"Introduci una frase: "); do{ scanf("%c",&p1[++i]);//leggo un carattere e lo memorizzo nella casella i+1 dell’array p1 //(notare che i e’ inizialmente -1 in modo che al primo incremento sia 0) }while(p1[i]!='\n');//ripeto le istruzioni contenute nel ciclo finche’ non ho letto il carattere \n p1[i]=‘\0'; //sostituisco all’ultimo carattere letto (cioe’ \n) il carattere di fine stringa fprintf(stdout,"La frase memorizzata e' %s\n”,p1); }

    ngnan$./scanf_strings.x Intorduci frase: ciao mondo La frase memorizzata e' ciao mondo

    STRINGHE

    oppure in questo modo (meglio)…

    Output:

  • Es.10

    #include #include #define LEN 30 int main() { char p1[LEN]; int i=-1; fprintf(stdout,"Introduci una frase: "); do{ scanf("%c",&p1[++i]);//leggo un carattere e lo memorizzo nella casella i+1 dell’array p1 //(notare che i e’ inizialmente -1 in modo che al primo incremento sia 0) if(i==(LEN-1)) fprintf(stderr,"La frase e' troppo lunga e verra' tagliata\n"); }while(p1[i]!=‘\n' && i

  • MANIPOLAZIONE DI STRINGHE

    Se vogliamo maggior controllo dell’input/output delle stringhe possiamo usare due funzioni getchar() e putchar()

    Con getchar() il programma legge dal buffer un singolo carattere alla volta, mentre con putchar() scrive sul buffer un singolo carattere alla volta

    dichiarazioni delle funzioni int getchar(void); int putchar(int c);

  • #include #include #define LEN 20 int main() {/*programma legge in input una stringa e la stampa*/ char frase[LEN]; int i,N=0; char ch; printf("inserisci una parola o una frase breve\n “); /*Il while sotto dice: se il carattere preso dal buffer in questo momento non e’ il carattere per andare a capo e se il contatore N non supera la lunghezza massima della stringa dove memorizzo la frase allora memorizza il carattere in frase[N] e incrementa il contatore N di 1*/

    while(( (ch=getchar())!='\n' ) && (N=LEN){//se ho letto un numero di caratteri maggiori della capienza max della stringa fprintf(stderr,"La frase inserita e' troppo lunga\n"); exit(1);//scrivi un messaggio di errore ed esci dal programma. }else{ frase[N]=‘\0’;//aggiungo il carattere di fine stringa printf("Hai digitato:\n"); for(i=0; i

  • #include #include #define LEN 20 int main() {/*programma legge in input una stringa e la stampa*/ char frase[LEN]; int i,N=0; char ch; printf("inserisci una parola o una frase breve\n“); /*Il while sotto dice: se il carattere preso dal buffer in questo momento non e’ il carattere per andare a capo e se il contatore N non supera la lunghezza massima della stringa dove memorizzo la frase allora memorizza il carattere in frase[N] e incrementa il contatore N di 1*/

    while(( (ch=getchar())!='\n' ) && (N=LEN){//se ho letto un numero di caratteri maggiori della capienza max della stringa fprintf(stderr,"La frase inserita e' troppo lunga\n"); exit(1);//scrivi un messaggio di errore ed esci dal programma. }else{ frase[N]=‘\0’; printf("Hai digitato:\n"); for(i=0; i

  • #include #include #define LEN 20 int main() {/*programma legge in input una stringa e la stampa*/ char frase[LEN]; int i,N=0; char ch; printf("inserisci una parola o una frase breve\n“); /*Il while sotto dice: se il carattere preso dal buffer in questo momento non e’ il carattere per andare a capo e se il contatore N non supera la lunghezza massima della stringa dove memorizzo la frase allora memorizza il carattere in frase[N] e incrementa il contatore N di 1*/

    while(( (ch=getchar())!='\n' ) && (N=LEN){//se ho letto un numero di caratteri maggiori della capienza max della stringa fprintf(stderr,"La frase inserita e' troppo lunga\n"); exit(1);//scrivi un messaggio di errore ed esci dal programma. }else{ frase[N]=‘\0’; printf("Hai digitato:\n"); for(i=0; i

  • Se vogliamo maggior controllo dell’input/output delle stringhe possiamo usare due funzioni getchar() e putchar()

    Con getchar() il programma legge da monitor un singolo carattere alla volta, mentre con putchar() scrive su schermo un carattere.

    dichiarazioni delle funzioni int getchar(void); int putchar(int c);

    Le due funzioni ci permettono di effettuare operazioni su stringhe:

    MANIPOLAZIONE DI STRINGHE

  • #include #include #define MAX_LEN 30 int main() { char c; char frase[MAX_LEN]; int i=0,count_space=0; printf("Inserire la frase\n”);

    while((c=getchar())!='\n'){ if(i

  • #include #include #define LEN 20 int main() { char frase[LEN],buffer[50],ch; int i=-1,M=0;

    printf("inserisci una parola di 5 caratteri senza spazi\n"); scanf("%5s",frase); printf("La parola introdotta e':\n"); printf("%s\n",frase); //prelevo i caratteri rimasti nel buffer while((ch=getchar())!='\n'){ buffer[M++]=ch; } buffer[M]='\0'; printf("Nel buffer erano rimasti i caratteri:\n"); for(i=0; i

  • int ReadString(char frase[], char buffer[]){ char ch; int N=0,K=0; while( ((ch=getchar()) !='\n') && (N=LEN){//se ho letto un numero di caratteri maggiori della capienza max della stringa fprintf(stderr,"La frase inserita e' troppo lunga e verra' troncata\n"); frase[LEN-1]='\0'; //svuoto il buffer leggendo il suo contenuto prelevo i caratteri rimasti nel buffer //in modo da poter leggere correttamente la seconda frase while((ch=getchar())!='\n'){ buffer[K++]=ch; } }else frase[N]='\0'; return N; }

    Es.13funzione che legge in input una frase, controlla la sua lunghezza e in caso le tronca se troppo lunghe e stampa il risultato. Se la frase e’ troppo lunga il buffer viene svuotato dai caratteri in avanzo in modo da poter leggere correttamente un’eventuale seconda frase

  • #include #include #define LEN 10

    int ReadString(char frase[], char buffer[]);

    int main() { char frase1[LEN],frase2[LEN],buff[30]; int i,len1,len2; char ch; printf("inserisci una parola o una frase breve\n"); len1=ReadString(frase1,buff); printf("inserisci un'altra frase\n"); len2=ReadString(frase2,buff);

    printf("La prima frase e':\n"); for(i=0; i

  • Includendo il file d’intestazione posso usufruire di alcune funzioni per la manipolazione delle stringhe

    restituisce la lunghezza di una stringa (quanti caratteri ci sono nella stringa escluso \0)

    strlen(stringa)

    MANIPOLAZIONE DI STRINGHE

  • #include #include #include #define MAX_LEN 30 /*QUESTO PROGRAMMA LEGGE IN INPUT UNA FRASE E RESTITUISCE IL NUMERO DI CARATTERI CHE COMPONGONO LA FRASE/ int main() { int main (void){ char c; char frase[MAX_LEN]; int i=0;

    printf("Inserire la frase\n"); while(( (c=getchar())!='\n' ) && (i=MAX_LEN){ printf("La frase e' troppo lunga!Il programma terminera' ora!\n"); exit(1); } printf("La lunghezza della frase inserita e' %llu\n",strlen(frase)); }

    strlen restituisce un unsigned long long int!

    vuole il puntatore alla stringa come input!

  • Includendo il file d’intestazione posso usufruire di alcune funzioni per la manipolazione delle stringhe

    restituisce la lunghezza di una stringa (quanti caratteri ci sono nella stringa escluso \0)

    strlen(stringa)

    strcpy(stringa1, stringa2)

    copia la stringa2 in stringa1

    strncpy(stringa1, stringa_2,len)

    copia len caratteri di stringa2 in stringa1. Se i len caratteri di stringa 2 non contengono il carattere di fine stringa, allora ricordarsi di aggiungere il carattere di fine stringa in stringa1 altrimenti stampera’ anche i caratteri di stringa1 che non sono stati sovrascritti

    MANIPOLAZIONE DI STRINGHE

  • #include #include #include #define LEN 10 /*QUESTO PROGRAMMA COPIA 6 CARATTERI dell’array parola1 nell’ array parola2*/ int main() { char parola1[LEN]; char parola2[LEN]; parola1[0]='c'; parola1[1]='i'; parola1[2]='a'; parola1[3]='o'; parola1[4]='\0';

    parola2[0]='m'; parola2[1]='o'; parola2[2]='n'; parola2[3]='d'; parola2[4]='o'; parola2[5]='\0';

    strncpy(parola1,parola2,6); printf("%s\n",parola1); }

    OUTPUT

    mondo

    //sto copiando 6 caratteri da parola2 a parola1

    ESEMPIO 1

  • #include #include #include #define LEN 10 /*QUESTO PROGRAMMA COPIA 6 CARATTERI dell’array parola1 nell’ array parola2*/ int main() { char parola1[LEN]; char parola2[LEN]; parola1[0]='c'; parola1[1]='i'; parola1[2]='a'; parola1[3]='o'; parola1[4]='\0';

    parola2[0]='m'; parola2[1]='o'; parola2[2]='n'; parola2[3]='d'; parola2[4]='o'; parola2[5]='\0';

    strncpy(parola1,parola2,3); printf("%s\n",parola1); }

    OUTPUT

    mono

    //sto copiando 3 caratteri da parola2 a parola1 ma non ho messo il carattere di fine stringa. Quando stampo parola 1 leggero’ i 3 caratteri copiati da stringa2 (cioe’ “mon”)+ i caratteri rimasti dentro stringa1 (cioe’ “o”) finche’ non trovo il fine stringa di parola1

    ALTRO ESEMPIO

  • #include #include #include #define LEN 10 /*QUESTO PROGRAMMA COPIA 6 CARATTERI dell’array parola1 nell’ array parola2*/ int main() { char parola1[LEN]; char parola2[LEN]; parola1[0]='c'; parola1[1]='i'; parola1[2]='a'; parola1[3]='o'; parola1[4]='\0';

    parola2[0]='m'; parola2[1]='o'; parola2[2]='n'; parola2[3]='d'; parola2[4]='o'; parola2[5]='\0';

    strncpy(parola1,parola2,3); parola1[3]=‘\0’; printf("%s\n",parola1); }

    OUTPUT

    mon

    //sto copiando 3 caratteri da parola2 a parola1 e aggiungo poi il carattere di fine stringa.

    ALTRO ESEMPIO

  • #include #include #include #define LEN 10 /*QUESTO PROGRAMMA COPIA I CARATTERI DEL SOTTOARRAY 1 DELL’ARRAY MULTIDIMENSIONALE AL SOTTOARRAY0 DELL’ARRAY MULTIDIMENSIONALE */ int main() { char parole[2][LEN];

    parole[0][0]='c'; parole[0][1]='i'; parole[0][2]='a'; parole[0][3]='o'; parole[0][4]='\0';

    parole[1][0]='m'; parole[1][1]='o'; parole[1][2]='n'; parole[1][3]='d'; parole[1][4]='o'; parole[1][5]='\0';

    strncpy(parole[0],parole[1],6);//sto copiando 6 caratteri da parole[1] a parole[0] printf(“%s\n",parole[0]); }

    OUTPUT

    mondo

    IN ALTERNATIVA

    vuole il puntatore alla sottostringa come input!

  • Includendo il file d’intestazione posso usufruire di alcune funzioni per la manipolazione delle stringhe

    restituisce la lunghezza di una stringa (quanti caratteri ci sono nella stringa escluso \0)

    strlen(stringa)

    strcpy(stringa1, stringa2)

    copia la stringa2 in stringa1strncpy(stringa1, stringa2,len)

    strcat(stringa1, stringa2)concatena il contenuto di stringa2 e stringa1 e mette il risultato in stringa1strncat(stringa1, stringa2,len)

    concatena n caratteri di stringa2 e stringa1 e mette il risultato in stringa1

    copia len caratteri di stringa2 in stringa1. Se i len caratteri di stringa 2 non contengono il carattere di fine stringa, allora ricordarsi di aggiungere il carattere di fine stringa in stringa1 altrimenti stampera’ anche i caratteri di stringa1 che non sono stati sovrascritti

    MANIPOLAZIONE DI STRINGHE

  • #include #include #include #define LEN 10 /*QUESTO PROGRAMMA CONCATENA DUE STRINGHE E STAMPA IL RISULTATO*/ int main() { char parola1[LEN]; char parola2[LEN]; parola1[0]='c'; parola1[1]='i'; parola1[2]='a'; parola1[3]='o'; parola1[4]='\0';

    parola2[0]='m'; parola2[1]='o'; parola2[2]='n'; parola2[3]='d'; parola2[4]='o'; parola2[5]='\0';

    strcat(parola1,parola2); printf("%s\n",parola1); }

    OUTPUT

    ciaomondo

  • Includendo il file d’intestazione posso usufruire di alcune funzioni per la manipolazione delle stringhe

    strcmp(stringa1, stringa2)

    compara due stringhe carattere per carattere e restituisce un intero i con:

    i =0 se le stringhe sono identiche

    i0 se il valore ASCII del primo carattere diverso di stringa1 e’ maggiore di quello di stringa 2

    strncmp(stringa1, stringa2,n)

    compara i primi n caratteri delle due stringhe

    MANIPOLAZIONE DI STRINGHE

  • #include #include #include #define LEN 10 /*QUESTO PROGRAMMA COMPARA DUE STRINGHE E STAMPA UN MESSAGGIO*/ int main() { char parola1[LEN]; char parola2[LEN]; int result; parola1[0]='c'; parola1[1]='i'; parola1[2]='a'; parola1[3]='o'; parola1[4]='\0';

    parola2[0]='m'; parola2[1]='o'; parola2[2]='n'; parola2[3]='d'; parola2[4]='o'; parola2[5]=‘\0';

    result=strcmp(parola1,parola2); if(result0) printf("** %s ** viene prima di ** %s ** in ordine alfabetico\n",parola2,parola1);

    if(result==0) printf("Le due parole sono identiche\n"); }

    OUTPUT

    ** ciao ** viene prima di **mondo ** in ordine alfabetico

  • Esempio: Ordinamento di parole acquisite da terminale

    vogliamo creare un programma che legga un testo, estrapoli le parole dal testo e le ordini alfabeticamente.

    La struttura del programma e’ :

    - memorizzazione del testo da tastiera attraverso la lettura di un carattere alla volta usando getchar()

    - identificazione delle parole e loro caricamento in un array multidimensionale in cui ciascun array che compone l’array multidimensionale contiene una parola del testo

    - algoritmo di bubblesort applicato alle parole attraverso l’uso della funzione strcmp()

    MANIPOLAZIONE DI STRINGHE

  • void ReadString(char phrase[],int *len){

    int i=0; char c,buffer[50]; printf("Inserire una frase scritta con caratteri minuscoli da scomporre e riordinare\n"); printf("(il tasto INVIO per terminare l'input, max 255 caratteri): "); while ((c = getchar()) != '\n' && i < MAX_STRING) { phrase[i++] = c; }

    *len=i;//*len conterra’ il n. di caratteri, spazi inclusi nel testo memorizzato if(*len>=MAX_STRING){//se ho letto un numero di caratteri maggiori della capienza max della stringa fprintf(stderr,"La frase inserita e' troppo lunga e verra' troncata\n"); phrase[MAX_STRING-1]='\0'; //svuoto il buffer i=0; while((c=getchar())!='\n'){ buffer[i++]=c; } }else phrase[*len]='\0'; }

    Lettura del testo inserito da tastiera passaggio di valori by reference. Terminata la funzione, verranno assegnati agli’indirizzi di memoria passati alla funzione dei valori

  • #include #include #include #define MAX_STRING 256 //DICHIARAZIONE void ReadString(char phrase[],int *len);

    int main() { char line[MAX_STRING]; int char_count;

    ReadString(line, &char_count);//CHIAMATA FUNZIONE LETTURA FRASE

    } //DEFINIZIONE (vedere slide precedente)

    OAIC OD \0NOM

    Lettura del testo inserito da tastiera

  • /* assegnamo caratteri consecutivi diversi dallo spazio ' ' nell'array words l'indice j del ciclo non si usa direttamente; al suo posto usiamo jchar per gestire spazi bianchi consecutivi. Alla fine si avra' una matrice di dimensioni [MAX_WORDS][MAX_STRING] dove ogni array che la compone e' fatto di parole (ci saranno count_w parole, ciascuna di lunghezza len variabile) Inoltre verra' riempito l'array wlength che contiene per ciascuna paroladi words, il numero totale dei caratteri. La funzione restituisce il numero di parole trovate nella frase*/

    int CutString(char words[][MAX_STRING],int wlength[],char phrase[],int lmax){ int j,jchar=0,len=0,count_w=0; char separator = ' '; for (j = 0; j < lmax; j++) {/* ciclo su tutti i caratteri memorizzati */ if (phrase[jchar] != separator) { //se il carattere che sta in phrase[jchar] non e' uno spazio words[count_w][len++] = phrase[jchar];/*allora e’ un carattere della parola di indice count_w*/ } else {//se il carattere e' uno spazio words[count_w][len++] = '\0'; //termina la parola wlength[count_w] = len;//scrivi la lunghezza della parola wordcount in wordlength count_w++; //comincia una nuova parola if (phrase[jchar+1] == separator){/*ignora spazi bianchi consecutivi */ jchar++; } len = 0;//azzera il contatore per cominciare a contare i caratteri di una nuova parola } jchar++; //preparati a leggere un nuovo carattere da line } words[count_w][len++] = '\0';//termina l'ultima parola memorizzata con il carattere “\0” wlength[count_w] = len;//memorizza la lunghezza dell’ultima parola return(count_w+1); }

    Separazione del testo in parole

  • #include #include #include #define MAX_STRING 256 //DICHIARAZIONE void ReadString(char phrase[],int *len); int CutString(char words[][MAX_STRING],int wlength[],char phrase[],int lmax); int main() { char line[MAX_STRING]; char nwords[MAX_WORDS][MAX_STRING]; int count_word, char_count; int wordlength[MAX_WORDS];

    ReadString(line, &char_count); count_word=CutString(nwords,wordlength,line,char_count); } //DEFINIZIONE (vedere slide precedente)

    Separazione del testo in parole

    0 2 3 41 5 6 7 8\0OAIC

    OD \0NOM01

  • void Bubblesort(int wlength[], char words[][MAX_STRING], int count_w){ char temp[MAX_STRING]; int len_tmp,i,iter; for (iter = 0; iter < count_w; iter++) { for (i = 0; i 0){//se la parola a cui punta words[i] > di quella a cui punta words[i+1] strcpy(temp,words[i+1]); //copia la parola a cui punta words[i+1] in un array temporale len_tmp=wlength[i+1];// copia la lunghezza della parola in una variabile temporale strcpy(words[i+1],words[i]);//copia la parola a cui punta words[i] in quella a cui punta words[i+1] wlength[i+1]=wlength[i];//copia la lunghezza della nuova parola nella casella di memoria associata i+1 strcpy(words[i],temp); //copia la parola nell'array temporale in quello puntato da words[i] wlength[i]=len_tmp; //associa la lunghezza della parola copiata nella casella di memoria i-esima di wlength } } } }

    BUBBLESORT

  • #include #include #include #define MAX_STRING 256 //DICHIARAZIONE void ReadString(char phrase[],int *len); int CutString(char words[][MAX_STRING],int wlength[],char phrase[],int lmax); void Bubblesort(int wlength[], char words[][MAX_STRING], int count_w); int main() { char line[MAX_STRING]; char nwords[MAX_WORDS][MAX_STRING]; int count_word, char_count; int wordlength[MAX_WORDS];

    ReadString(line, &char_count); count_word=CutString(nwords,wordlength,line,char_count); Bubblesort(wordlength,nwords,count_word); } //DEFINIZIONE (vedere slide precedente)

    Bubblesort

  • void PrintWords(char words[][MAX_STRING], int count_w){ int i; for(i=0;i

  • #include #include #include #define MAX_STRING 256 //DICHIARAZIONE void ReadString(char phrase[],int *len); int CutString(char words[][MAX_STRING],int wlength[],char phrase[],int lmax); void Bubblesort(int wlength[], char words[][MAX_STRING], int count_w); void PrintWords(char words[][MAX_STRING], int count_w); int main() { char line[MAX_STRING]; char nwords[MAX_WORDS][MAX_STRING]; int count_word, char_count; int wordlength[MAX_WORDS];

    ReadString(line, &char_count); count_word=CutString(nwords,wordlength,line,char_count); printf("Prima dell'ordinamento le parole sono:\n"); PrintWords(nwords,count_word); Bubblesort(wordlength,nwords,count_word); printf("Dopo l'ordinamento le parole sono:\n"); PrintWords(nwords,count_word); } //DEFINIZIONE (vedere slide precedente)

    WORDSORT

  • LETTURA DI STRINGHE DA FILESupponiamo di voler leggere una serie di parole da file. Supponiamo ad esempio che queste parole abbiano tutte la stessa lunghezza e siano contenute in un file chiamato lista.dat

  • Supponiamo di voler leggere una serie di parole da file. Supponiamo ad esempio che queste parole abbiano tutte la stessa lunghezza e siano contenute in un file chiamato lista.dat Un primo metodo consiste nell’utilizzare la funzione fgetc() la cui sintassi e’int fgetc(FILE *stream);#include #define N 50 int main() { int k=0,kmax,i=0; char parole[N][8],c;//memorizzo le parole nell’array multidimensionale parole costituito da N parole di //lunghezza 8 (incluso il carettere di fine stringa) FILE *fp; fp=fopen("lista.dat","r"); while((c=fgetc(fp))!=EOF){//Leggo carattere per carattere il contenuto del file if(c !='\n'){ parole[k][i++]=c; }else{//se incontro il carattere di andata a capo, vuol dire la parola da leggere e’ finita parole[k][i]='\0';//concludo la stringa con il carattere di fine stringa k++;//aggiorno il contatore delle parole i=0;//inizializzo a 0 il contatore dei caratteri di una parola } } kmax=k;// contiene il numero di parole letto dal file for(k=0;k

  • #include #define N 50 int main() { int k=0,kmax,i=0; char parole[N][8],c;//memorizzo le parole nell’array multidimensionale parole costituito da N parole di //lunghezza 8 (incluso il carettere di fine stringa) FILE *fp; fp=fopen("lista.dat","r"); while((c=fgetc(fp))!=EOF){//Leggo carattere per carattere il contenuto del file if(c !='\n'){ parole[k][i++]=c; }else{//se incontro il carattere di andata a capo, vuol dire la parola da leggere e’ finita parole[k][i]='\0';//concludo la stringa con il carattere di fine stringa k++;//aggiorno il contatore delle parole i=0;//inizializzo a 0 il contatore dei caratteri di una parola } } kmax=k;// contiene il numero di parole letto dal file for(k=0;k

  • #include #define N 50 int main() { int k=0,kmax,i=0; char parole[N][8],c;//memorizzo le parole nell’array multidimensionale parole costituito da N parole di //lunghezza 8 (incluso il carettere di fine stringa) FILE *fp; fp=fopen("lista.dat","r"); while((c=fgetc(fp))!=EOF){//Leggo carattere per carattere il contenuto del file if(c !='\n'){ parole[k][i++]=c; }else{//se incontro il carattere di andata a capo, vuol dire la parola da leggere e’ finita parole[k][i]='\0';//concludo la stringa con il carattere di fine stringa k++;//aggiorno il contatore delle parole i=0;//inizializzo a 0 il contatore dei caratteri di una parola } } kmax=k;// contiene il numero di parole letto dal file for(k=0;k

  • Supponiamo di voler leggere una serie di parole da file. Supponiamo ad esempio che queste parole abbiano tutte la stessa lunghezza e siano contenute in un file chiamato lista.dat Un seconfo metodo consiste nell’utilizzare la funzione fgets() la cui sintassi e’

    char *fgets(char *s, int size, FILE *stream);

    #include #define N 50 int main() { int k=0,kmax,i=0; char parole[N][8],c;//memorizzo le parole nell’array multidimensionale parole costituito da N parole di //lunghezza 8 (incluso il carettere di fine stringa)

    FILE *fp; fp=fopen("lista.dat","r"); while(fgets(parole[k],8,fp)!=NULL){//legge una linea alla volta e immagazzina la parola nel vettore k di parole k++; } kmax=k; for(k=0;k