Vai alla Home Page About me Courseware Federica Living Library Federica Federica Podstudio Virtual Campus 3D Le Miniguide all'orientamento Gli eBook di Federica La Corte in Rete
 
I corsi di Scienze Matematiche Fisiche e Naturali
 
Il Corso Le lezioni del Corso La Cattedra
 
Materiali di approfondimento Risorse Web Il Podcast di questa lezione

Salvatore Cuomo » 14.Approfondimenti di C, Stringhe e file


Passaggio di parametri ad una funzione main

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.

Codice_C_1

Codice_C_1


Parametri

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 stesso

int main(int argc, char *argv[])
{

...

}

Esempio 2: manipolazione di caratteri

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.

Codice_C_2

Codice_C_2

Codice_C_3

Codice_C_3


I/O dei caratteri

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.

Esempio 3: manipolazione di caratteri

Problema3. Si vuole scrivere un programma che legga da tastiera un testo e lo stampi a video trasformandolo tutto in lettere maiuscole.

Codice_C_4

Codice_C_4


Manipolazione di caratteri

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’alfabeto
  • isdigit verifica se l’argomento è una cifra
  • islower verifica se l’argomento  è una lettera minuscola
  • isupper verifica se l’argomento è una lettera maiuscola
  • ispunct verifica se l’argomento  è un carattere di punteggiatura
  • isspace verifica se l’argomento è un carattere di separazione
  • tolower restituisce la lettera minuscola equivalente al carattere minuscolo passato come argomento
  • toupper restituisce la lettera maiuscola equivalente al carattere minuscolo passato come argomento

Sono tutte funzioni di tipo intero che servono a simulare il tipo di dato logico, con argomento di tipo carattere

Le stringhe

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 memoria
  • char c[2]="a"; indica una stringa, memorizzata in due locazioni di memoria consecutive contenenti i caratteri ‘a’ e ‘\0′
Array di caratteri.

Array di caratteri.


Lettura di una stringa

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:

  • una stringa non può contenere degli spazi
  • l’array che deve contenere la stringa deve essere opportunamente dimensionato

Esempio 4: Lunghezza stringa

Problema3. Si vuole scrivere un programma che calcoli la lunghezza di una prefissata stringa di caratteri.

Codice_C_5

Codice_C_5


Esempio 5: Copia di una stringa

Problema3. Si vuole scrivere un programma che copia una prefissata stringa di caratteri.

Codice_C_6

Codice_C_6


Esempio 6: Ricerca in una stringa

Problema3. Si vuole scrivere un programma che ricerchi in una prefissata stringa di caratteri.

Codice_C_7

Codice_C_7

Codice_C_8

Codice_C_8


Manipolizione di stringhe

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 s
  • strcpy(s1,s2) copia s2 in s1
  • strcmp(s1,s2) confronta le due stringhe e restituisce un intero negativo se s1 < s2, zero se s1 = s2, un intero positivo se s1 > s2
  • strcat(s1,s2) concatena s1 con s2, copiando i caratteri che costituiscono s2 in coda a quelli di s1, e restituendo un puntatore a s1
  • strstr(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 double
  • atoi(s) converte la stringa s in un numero intero

Esempio 7: Stampa e lettura da un file

Problema5. Si vuole scrivere un programma che stampi in un file.

Problema6. Si vuole scrivere un programma che legga in un file.

Codice_C_9

Codice_C_9

Codice_C_10

Codice_C_10


I 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);

I File

Il C standard prevede alcuni file testo standard:

  • stdin = standard input (tastiera)
  • stdout = standard output (video)
  • stderr = standard error (video)

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

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:

  • i file testo possono essere facilmente manipolati mediante un qualsiasi text editor
  • i file testo sono trasportabili
  • i file binari occupano meno spazio
  • i file binari sono più veloci da leggere e a scrivere

Esempio 7: Stampa e lettura da un file binario

Problema5. Si vuole scrivere un programma che stampi in un file binario.

Problema6. Si vuole scrivere un programma che legga in un file binario.

Codice_C_111

Codice_C_111

Codice_C_12

Codice_C_12


Operare su 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”:

  • “rb” = solo lettura
  • “wb” = scrittura
  • “ab” = appendi

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

I materiali di supporto della lezione

Esercizi

  • Contenuti protetti da Creative Commons
  • Feed RSS
  • Condividi su FriendFeed
  • Condividi su Facebook
  • Segnala su Twitter
  • Condividi su LinkedIn
Progetto "Campus Virtuale" dell'Università degli Studi di Napoli Federico II, realizzato con il cofinanziamento dell'Unione europea. Asse V - Società dell'informazione - Obiettivo Operativo 5.1 e-Government ed e-Inclusion