Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
Funzioni standard di output
#include <stdio.h>
int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
#include <stdio.h> Perché array y è dichiarato di lunghezza
int main(void) { 5 ma contiene solo 4 caratteri?
char x = ‘a’;
char y[5] = "abcd";
printf("%c\n", x); /* stampa il carattere contenuto nella variabile x */
printf("%s\n", y); /* stampa la stringa contenuta nell’array y */
}
Funzioni standard di output
#include <stdio.h>
int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
L’ultimo elemento dell’array deve contenere
#include <stdio.h> ‘
il carattere di terminazione stringa \0’.
int main(void) { Le funzioni standard del C assumono che le
char x = ‘a’; stringhe siano sempre terminate.
char y[5] = "abcd\0";
printf("%c\n", x); /* stampa il carattere contenuto nella variabile x */
printf("%s\n", y); /* stampa la stringa contenuta nell’array y */
}
Il tipo di dati stringa di caratteri
char,
Le stringhe sono array di elementi di tipo il cui ultimo elemento è
0 o, equivalentemente, il carattere di terminazione di stringa ‘\0’.
char s[] = "pippo";
è equivalente a char s[6] = "pippo";
è equivalente a
char s[] = {'p','i','p','p','o','\0'};
è equivalente a (NB: non del tutto equivalente, vedremo in che senso più
avanti): char *s = "pippo";
Funzioni standard di output
#include <stdio.h>
int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
#include <stdio.h>
int main(void) {
char x = ‘a’;
char y[5] = abcd ;
" "
printf("Carattere %c e stringa %s \n", x, y);
/* stampa il carattere contenuto nella variabile x e, di seguito, la stringa
contenuta in y */
}
La stringa di formato
Alcuni dei più comuni codici per la stringa di formato:
%d Stampa l’argomento corrispondente come un numero decimale con segno,
e.g., 3490. L’argomento deve essere un int.
%f Stampa l’argomento corrispondente come un numero floating-point, e.g.,
3.14159. L’argomento deve essere un float.
%c Stampa l’argomento corrispondente come un carattere, e.g., 'B'. L’argomento
deve essere un char.
%s Stampa l’argomento corrispondente come una stringa, e.g., "Salve mondo?".
L’argomento deve essere un char* o un char[].
%% Nessun argomento viene convertito, viene stampato un semplice segno di
percento. È il modo di stampare '%' con printf().
%p Stampa un tipo puntatore in formato esadecimale, i.e., l’indirizzo di memoria a cui
il puntatore punta. (Non il valore memorizzato nell’indirizzo, ma il numero
corrispondente alla cella di memoria.)
Funzioni standard di output
#include <stdio.h>
int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
#include <stdio.h>
int main(void) {
FILE *fd = fopen("myfile.txt", "w");
char y[5] = "abcd";
if (fd) {
fprintf(fd,"%s\n", y); /* inserisce nel file la stringa contenuta in y */
fclose(fd);
}
}
Funzioni standard di output
#include <stdio.h>
int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
Variabile di tipo puntatore
a (descrittore di) file.
#include <stdio.h>
int main(void) {
FILE *fd = fopen("myfile.txt", "w");
char y[5] = "abcd";
if (fd) {
fprintf(fd,"%s\n", y); /* inserisce nel file la stringa contenuta in y */
fclose(fd);
}
}
Funzioni standard di output
#include <stdio.h>
int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
#include <stdio.h>
int main(void) {
FILE *fd = fopen("myfile.txt", "w"); Funzioni di apertura e
char y[5] = "abcd"; chiusura di file.
if (fd) {
fprintf(fd,"%s\n", y); /* inserisce nel file la stringa contenuta in y */
fclose(fd);
}
}
Funzioni standard di output
#include <stdio.h>
FILE *fopen(const char *name, char *mode);
int fclose(FILE *stream);
#include <stdio.h>
int main(void) {
FILE *fd = fopen("myfile.txt","w");
char y[5] = "abcd";
if (fd) {
fprintf(fd,"%s\n", y); /* inserisce nel file la stringa contenuta in y */
fclose(fd);
}
}
Modalità di apertura file
I possibili valori per il mode in fopen("myfile.txt", mode) sono:
r Apre il file per la lettura (read-only).
w Apre il file per la scrittura (write-only). Il file viene creato se non esiste.
r+ Apre il file per lettura e scrittura. Il file deve già esistere.
w+ Apre il file per scrittura e lettura. Il file viene creato se non esiste.
a Apre il file per aggiornamento (append). È come aprire il file per la scrittura, ma ci si
posiziona alla fine del file per aggiungere dati alla fine. Il file viene creato se non esiste.
a+ O Apre il file per lettura e aggiornamento. Il file viene creato se non esiste.
Funzioni standard di input
#include <stdio.h>
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
Indirizzo della variabile intera x.
#include <stdio.h>
int main(void) {
char x;
printf("Inserire un carattere:");
scanf("%c", &x);
/* riceve un carattere da tastiera e lo inserisce nella variabile x */
}
Funzioni standard di input
#include <stdio.h>
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
ATTENZIONE!!!
#include <stdio.h>
int main(void) {
char x;
scanf("Inserire un carattere: %c", &x);
/* Legge da tastiera la stringa "Inserire un carattere:" seguita da un ultimo
carattere che viene inserito nella variabile x */
}
Funzioni standard di input
#include <stdio.h>
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
#include <stdio.h>
int main(void) {
char x[10];
printf("Inserire una stringa di 9 caratteri:");
scanf("%s", &x); /* Legge da tastiera la stringa che viene inserita nell’array x */
}
Funzioni standard di input
#include <stdio.h>
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
#include <stdio.h> Cosa succede se si inseriscono
più di 10 caratteri?
int main(void) {
char x[10];
printf("Inserire una stringa di 9 caratteri:");
scanf("%s", &x); /* Legge da tastiera la stringa che viene inserita nell’array x */
}
Funzioni standard di input
#include <stdio.h>
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
Errore di indirizzamento
#include <stdio.h> (segmentation fault)!
Non vi è alcun controllo sui
int main(void) {
char x[10]; limiti degli array!
printf("Inserire una stringa di 9 caratteri:");
scanf("%s", &x); /* Legge da tastiera la stringa che viene inserita nell’array x */
}
Funzioni standard di input
#include <stdio.h>
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
#include <stdio.h> Una possibile soluzione
int main(void) {
char x[10];
printf("Inserire una stringa di 9 caratteri:");
scanf("%9c", &x);
/* Legge una stringa i cui primi 9 caratteri vengono inseriti nell’array x */
}
Funzioni standard di input
#include <stdio.h>
int getc(FILE *stream);
int fgetc(FILE *stream);
int getchar(void);
#include <stdio.h> Una soluzione più robusta.
int main(void) {
char x[10];
printf("Inserire una stringa di 9 caratteri:");
for(i=0; (i<9 && (c = getchar()) !='\n‘ && c != EOF; i++) /* legge e inserisce max 9
x[i]=c; caratteri in x */
x[i] = ‘\0’; /* inserimento carattere di terminazione stringa */
}
Funzioni standard di input
#include <stdio.h>
int getc(FILE *stream);
int fgetc(FILE *stream);
#include <stdio.h>
int main(void) {
char x[10],c;
FILE *fd = fopen("myfile.txt", "r");
if (fd) {
for(i=0; (i<9 && (c = fgetc(fd))!='\n' && c != EOF); i++)
x[i]=c;
x[i]=‘\0’;
fclose(fd);
}
}
Strutture
Per aggregare variabili di tipo diverso sotto un unico nome il C fornisce le
strutture.
struct punto { struct rettangolocoloratoepesato {
int x; int colore;
int y; double peso;
}; struct punto bottomleft, topright;
};
struct punto sommapunti(struct punto a, struct punto b)
{ a.x += b.x;
a.y += b.y;
return a;
}
Strutture
Per aggregare variabili di tipo diverso sotto un unico nome il C fornisce le strutture.
struct punto { struct rettangolocoloratoepesato {
int x; int colore;
int y; double peso;
}; struct punto bottomleft, topright;
" "
};
Operatore . (punto) per
accesso a campo di struct.
struct punto sommapunti(struct punto a, struct punto b)
{ a.x += b.x;
a.y += b.y;
return a;
}
Allocazione dinamica della memoria
#include <stdlib.h>
void *malloc(int dim);
void *calloc(int nelem, int dimelem);
void free(void *ptr);
…
int *interi;
char *string;
interi = (int *) malloc(n * sizeof(int)); /* allocazione di spazio per n interi */
stringa = (char *) calloc(n, sizeof(char)); /* allocazione di n caratteri */
…
free(interi);
free(stringa);
Allocazione dinamica della memoria
#include <stdlib.h>
void *malloc(int dim); Tipo puntatore a (indirizzo di) dato intero.
void *calloc(int nelem, int dimelem);
void free(void *ptr);
… Tipo puntatore a (indirizzo di) dato carattere.
int *interi;
char *string;
interi = (int *) malloc(n * sizeof(int)); /* allocazione di spazio per n interi */
stringa = (char *) malloc(n * sizeof(char)); /* allocazione di n caratteri */
…
free(interi);
free(stringa);
Allocazione dinamica della memoria
#include <stdlib.h>
void *malloc(int dim);
void *calloc(int nelem, int dimelem);
void free(void *ptr); Operazione di casting per
… modificare il tipo di un dato.
int *interi;
char *string;
interi = (int *) ma