La funzione main. È possibile in C passare attraverso la linea di comando di una shell (prompt dei comandi) alcuni argomenti opzionali come ad esempio nomi di file o specifiche di opzioni. Nell’esempio mostriamo una linea di comando ed un programma “prog” a cui sono passati alcuni argomenti.
$ prog arg2 arg3 arg4 arg5
Il main deve essere però opportunamente strutturato.
I Parametri della funzione main( )
La funzione main( )
ha 2 argomenti di nome prefissato:
argc
= intero che fornisce il numero di argomenti della linea di comando;argv
= array di puntatori a carattere (visto come array di stringhe) ciascuna stringa contiene uno degli argomenti della linea di comando (argv[0] contiene il nome del comando stessoint main(int argc, char *argv[])
{
...
}
Problema1. Si vuole scrivere un programma che legga da tastiera una sequenza di caratteri e li stampi a video.
Problema2. Si vuole scrivere un programma che visualizzi i caratteri ASCII e li stampi a video.
Le funzioni getchar
e putchar
, definite nell’header file stdio.h
, servono per l’input e l’output di caratteri
int getchar()
restituisce un intero corrispondente al codice del tasto della tastiera premuto oppure il valore predefinito EOF in caso di segnalazione di fine file
int putchar(char c)
invia al video il carattere c e restituisce il corrispondente codice del tasto della tastiera se l’operazione di output ha avuto successo
Da tastiera il valore predefinito EOF può essere inserito con CTRL+D o con CTRL+Z, a seconda della versione del sistema operativo.
Problema3. Si vuole scrivere un programma che legga da tastiera un testo e lo stampi a video trasformandolo tutto in lettere maiuscole.
Funzioni definite nell’header file ctype.h
per operare sui caratteri prescindendo dalla loro codifica (fatta salva la consecutività dei caratteri numerici ‘0′, ‘1′, … e dei caratteri minuscoli e maiuscoli ‘a’, ‘b’, …, ‘A’, ‘B’, …):
isalpha
verifica se l’argomento è una lettera dell’alfabetoisdigit
verifica se l’argomento è una cifraislower
verifica se l’argomento è una lettera minuscolaisupper
verifica se l’argomento è una lettera maiuscolaispunct
verifica se l’argomento è un carattere di punteggiaturaisspace
verifica se l’argomento è un carattere di separazionetolower
restituisce la lettera minuscola equivalente al carattere minuscolo passato come argomentotoupper
restituisce la lettera maiuscola equivalente al carattere minuscolo passato come argomentoSono tutte funzioni di tipo intero che servono a simulare il tipo di dato logico, con argomento di tipo carattere
Una variabile di tipo char
può contenere un solo carattere.
Per trattare sequenze di caratteri il linguaggio C introduce le stringhe, intese come array di caratteri in cui è specificato il carattere di terminazione della stringa (‘\0′).
La figura mostra l’effetto della dichiarazione
char giorno[7]="sabato";
Si osservi che
char c='a';
indica un unico carattere memorizzato in un’unica locazione di memoriachar c[2]="a";
indica una stringa, memorizzata in due locazioni di memoria consecutive contenenti i caratteri ‘a’ e ‘\0′Facciamo un esempio pratico di lettura di una stringa:
char giorno[100];
scanf("%s",giorno);
Si osservi che la variabile giorno
è un array, per cui il secondo argomento passato alla funzione scanf (giorno)
è l’indirizzo del primo elemento dell’array giorno (&giorno[0])
In giorno
verrà memorizzata una sequenza di caratteri immessi in input racchiusa fra caratteri di separazione (spazio, tabulazione, andata a capo, …).
In conclusione si ha che:
Problema3. Si vuole scrivere un programma che calcoli la lunghezza di una prefissata stringa di caratteri.
Problema3. Si vuole scrivere un programma che copia una prefissata stringa di caratteri.
Problema3. Si vuole scrivere un programma che ricerchi in una prefissata stringa di caratteri.
Il linguaggio C standard prevede varie funzioni per la manipolazione di stringhe, contenute nell’header file string.h
strlen(s)
restituisce la lunghezza della stringa sstrcpy(s1,s2)
copia s2 in s1strcmp(s1,s2)
confronta le due stringhe e restituisce un intero negativo se s1 < s2, zero se s1 = s2, un intero positivo se s1 > s2strcat(s1,s2)
concatena s1 con s2, copiando i caratteri che costituiscono s2 in coda a quelli di s1, e restituendo un puntatore a s1strstr(s1,s2)
ricerca la stringa s2 nella stringa s1, restituendo un puntatore al punto di s1 dove inizia s2 (oppure NULL se s2 non è presente)atof(s)
converte la stringa s in un numero reale a doppia precisione, restituendo il risultato in un doubleatoi(s)
converte la stringa s in un numero interoProblema5. Si vuole scrivere un programma che stampi in un file.
Problema6. Si vuole scrivere un programma che legga in un file.
Un file testo è una sequenza di componenti tutti dello stesso tipo caratterizzata dall’accesso sequenziale.
Per operare su un file testo, questo deve essere “aperto”:
fp=fopen("nome_file","tipo_apertura");
con:
fp puntatore a file: FILE *fp;
“nome_file” stringa contenente il nome del file, incluso il percorso nel file system
“tipo_apertura” stringa che specifica il tipo di operazioni da compiere sul file (“r”=solo lettura; “w”=scrittura; “a”=appendi; “r+”=lettura e scrittura )
Una volta terminato di operare su un file, questo deve essere “chiuso”:
fclose(puntatore_a_file);
Il C standard prevede alcuni file testo standard:
Questi sono sempre predisposti, per cui non devono essere né aperti né chiusi
Per la lettura e la scrittura su file testo sono disponibili funzioni analoghe a quelle per i file testo standard:
fscanf(puntatore_a_file,”%d”,&intero);
fprintf(puntatore_a_file,”%d”,intero);
carattere=getc(puntatore_a_file);
putc(carattere, puntatore_a_file);
I file considerati sinora sono detti file testo:
le informazioni contenute nel file, rappresentate in binario nel calcolatore, vengono convertite nel formato del loro tipo di dato e così memorizzate
Nei file binari, invece, le informazioni contenute nel file sono memorizzate direttamente in binario.
File testo vs. file binari:
Problema5. Si vuole scrivere un programma che stampi in un file binario.
Problema6. Si vuole scrivere un programma che legga in un file binario.
Per operare su un file binario, questo deve essere “aperto” in modo binario:
fp=fopen("nome_file","tipo_apertura");
con “tipo_apertura”:
Per la lettura e la scrittura su file binario sono disponibili le funzioni:
fread(ind_dati, sizeof(dati), num_dati, puntatore_a_file);
fwrite(ind_dati, sizeof(dati), num_dati, puntatore_a_file);
1. Prolusione
2. Sistemi Operativi – parte prima
3. Sistemi Operativi – parte seconda
6. Il linguaggio C – parte prima
8. Il linguaggio C – funzioni e puntatori
10. Il linguaggio C – parte terza
11. La documentazione del software
12. Dati strutturati
13. Esercizi sui dati strutturati
14. Approfondimenti di C, Stringhe e file
15. Esercizi su stringhe e file
16. La ricorsione
17. Il linguaggio c++ parte prima
18. Il linguaggio C++ - parte seconda
19. Strutture dati di tipo astratto