I CARATTERI E LE STRINGHE

Похожие документы
Caratteri e stringhe

Input/Output di numeri

IL PRIMO PROGRAMMA IN C

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

Variabili e Istruzioni

Stringhe e allocazione dinamica della memoria

File binari e file di testo

Alfabeto ed elementi lessicali del linguaggio C

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

Caratteri e stringhe

Caratteri e stringhe. Vettori di caratteri. Il tipo stringa Terminatore nullo Input/output di stringhe Politecnico di Torino 1

Input/output da file I/O ANSI e I/O UNIX FLUSSI E FILE FLUSSI FLUSSI di TESTO FLUSSI BINARI FILE

Esercitazione 6. Array

C: panoramica. Violetta Lonati

Espressione di chiamata di funzione

Linguaggio C - sezione dichiarativa: costanti e variabili

Introduzione al linguaggio C

Stringhe di caratteri

LIBRERIE STANDARD in C. LIBRERIE STANDARD in C

Linguaggio C: PUNTATORI

Lettura da tastiera e scrittura su monitor

<programma> ::= {<unità-di-traduzione>} <main> {<unità-di-traduzione>}

La programmazione nel linguaggio C

Problema. Vettori e matrici. Vettori. Vettori

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

La rappresentazione delle informazioni

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

Linguaggio C: introduzione

LA CODIFICA DELL INFORMAZIONE. Introduzione ai sistemi informatici D. Sciuto, G. Buonanno, L. Mari, McGraw-Hill Cap.2

Esercizi Programmazione I

ESECUZIONE DI PROGRAMMI C SU MACCHINE REALI. Docente: Giorgio Giacinto AA 2008/2009. formalizzazione degli algoritmi in linguaggio C

Scrittura formattata - printf

Programmare in C. Maurizio Palesi Salvatore Serrano. Valori. Operazioni. Un insieme di valori del tipo. Per operare su tali valori Tipi

Le funzioni, e le istruzioni di input/output

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Lezione 10. L arte della programmazione

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

Il sistema C è formato dal linguaggio C, dal preprocessore, dal compilatore, dalle librerie e da altri strumenti di supporto.

Il tipo char ha dimensione di un byte e contiene il numero di codice ASCII che gli corrisponde.

Esercitazione 4. Comandi iterativi for, while, do-while

Realizzare un programma che legga da input tre numeri interi e stampi a video la loro somma e la media.

Introduzione al C. Introduzione. Linguaggio ad alto livello. Struttura di un programma C

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

La codifica binaria. Fondamenti di Informatica. Daniele Loiacono

Variabili. Tipi di dati di base. Variabili. Variabili

La gestione dei caratteri in C

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di

Linguaggio C Informatica Grafica

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

modificato da andynaz Cambiamenti di base Tecniche Informatiche di Base

Le basi del linguaggio Java

Uso avanzato dei puntatori Allocazione dinamica della memoria

Le direttive del Preprocessore

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

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Транскрипт:

I CARATTERI E LE STRINGHE

IL CODICE ASCII Per memorizzare i simboli grafici corrispondenti ai caratteri bisogna associare un numero intero a ciascuno di essi Il codice ASCII / æski/ (American Standard Code for Information Interchange) è una tabella che elenca le corrispondenze tra simboli grafici e numeri (es. A - 65, B - 66) I numeri del Codice ASCII standard sono a 7 bit: 2 7 =128 caratteri diversi

IL CODICE ASCII

IL CODICE ASCII Poiché i bit vengono considerati a gruppi di 8 (byte) e non di 7, il codice ASCII viene modificato così da usare valori di 8 bit, questo raddoppia il numero di codici utilizzabili che passano a 256 I 128 caratteri aggiuntivi (con codice da 128 a 255) vengono utilizzati per altri simboli grafici meno comuni (es. le lettere accentate, à, ë, î) La parte aggiunta non è standard ed è diversa per ciascun sistema operativo Può essere diversa anche nello stesso sistema operativo a seconda della lingua

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

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

CARATTERI Variabili carattere: variabili di tipo intero su 8 bit, sono definite di tipo char Tutte le assegnazioni precedenti sono equivalenti ed assegnano il carattere 'A' (codice ASCII 65) alla variabile y

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

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 carattere char apice = '\''; Poiché il carattere \ ha un significato speciale, quando esso serve come carattere normale deve essere raddoppiato (anche nelle stringhe) char backslash = '\\';

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

CARATTERI \a - quando viene visualizzato fa emettere un beep \n - corrisponde al carattere new line \r - corrisponde al carattere carriage return \t - corrisponde al carattere Tab char beep = '\a';

STRINGHE Sono vettori di char terminati da un carattere di codice ASCII pari a 0 (il terminatore non è il carattere '0' che ha valore 48 nel codice ASCII, ma il carattere '\0') Le terminate da uno 0 vengono anche dette stringhe ASCIIZ, il linguaggio C ha solo questo tipo di stringhe

STRINGHE Stringhe costanti Sono sequenze di caratteri racchiuse da doppi apici, la stringa "ciao ciao" è composta da 9+1 caratteri, l ultimo è '\0' Per includere in una stringa i caratteri \ e " è necessario precederli dal carattere di escape \ "vero\\falso" memorizza: vero\falso "premi \"invio\" per terminare" memorizza: premi "invio" per terminare Una stringa costante viene anche chiamata letterale stringa (string literal)

STRINGHE Più stringhe costanti consecutive (separate da nulla, spazi, Tab o ritorni a capo) vengono concatenate dal compilatore in una sola: "ciao" "ciao" "ciao" "ciao" viene memorizzata come fosse scritta così: "ciaociaociaociao" (17 caratteri) Una stringa costante è un vettore di char di classe di allocazione static (quindi non modificabile) inizializzato con i caratteri dati

STRINGHE Variabili stringa Sono vettori di char di dim. fissa, l ultimo carattere deve essere il terminatore '\0' char nome[15]; definisce una variabile stringa composta di 15 char, può contenere fino a 14 caratteri utili (deve esserci spazio per il carattere '\0') Il 1 o carattere è nome[0], il 2 o nome[1], ecc. Il terminatore permette di occupare solo parzialmente una stringa (lo spazio relativo ai restanti caratteri esiste ma è inutilizzato)

STRINGHE La lunghezza di una stringa è il numero di caratteri contenuti (fino al '\0' escluso), non la sua capienza 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

STRINGHE Si possono inizializzare le variabili stringa in 2 modi equivalenti: char s[20]="ciao"; char s[20]={'c','i','a','o'}; Il carattere di posizione 4 (il 5 o ) è '\0' in entrambi i casi: infatti, essendo vettori, se l inizializzazione non riempie completamente la stringa, i caratteri successivi a quelli indicati sono tutti 0 (cioè '\0')

STRINGHE I singoli elementi della stringa sono caratteri: s[2] vale 'a' s[0] = 'M'; modifica s in "Miao" Per assegnare una stringa NON si può scrivere s="ciao" ma serve una funzione

I/O DI CARATTERI <STDIO.H> printf("%c", varchar); manda in output il carattere scanf("%c", &varchar); legge 1 carattere (anche spazi e ritorni a capo) e lo mette in varchar, se viene indicata un ampiezza (es. %4c) legge esattamente quel numero di caratteri (anche spazi) e li assegna alla STRINGA indicata come parametro, senza aggiungere il '\0': scanf("%4c", varstringa); per saltare gli spazi iniziali si usi %1s

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

I/O DI CARATTERI <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

I/O DI CARATTERI <STDIO.H> 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)

I/O DI CARATTERI <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 %1s (richiede una variabile stringa)

I/O DI CARATTERI <STDIO.H> Un qualsiasi white space nella stringa di formato richiede che tutti i white space in quel punto dell input vengano saltati (quindi anche il carattere '\n' non viene considerato come carattere ordinario: non indica affatto alla scanf che deve attendere un ritorno a capo)

I/O DI CARATTERI <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 iniziali Esempio scanf("%[abcfrq]", s); Se si dà in input abbaino, s contiene abba mentre ino resta disponibile per le successive funzioni di input

I/O DI CARATTERI <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

I/O DI CARATTERI <STDIO.H> Per leggere una stringa fino a fine riga utilizzando una scanf si può quindi utilizzare la specifica %[^\n]%*c che legge tutti i caratteri che trova finché non incontra il ritorno a capo '\n', la parte %*c legge e scarta (non memorizza) il ritorno a capo

I/O DI CARATTERI <STDIO.H> Se si danno in input più caratteri di quelli che la variabile stringa può contenere, si va in buffer overflow e si possono avere comportamenti anomali Soluzione non preventiva: richiedere al compilatore di aggiungere controlli opportuni

I/O DI CARATTERI <STDIO.H> 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 Se si usa una scanf, si può specificare la dimensione massima del campo in input: es. %20s