#include void array_str_test() { char hello1[] = "hello1234\n"; // la stringa ha lunghezza 10 caratteri + '\0' finale // hello1 è un array di caratteri di dimensione fissa pari a 11 elementi // dato che sizeof(char) = 1, la dimensione totale di hello1 è pari a 11 * 1 = 11 bytes printf("sizeof(hello1) = %d\n", sizeof(hello1)); printf("hello1 = %s\n", hello1); hello1[0] = 'H'; printf("hello1 = %s\n", hello1); /// char * hello2 = "hello1234\n"; // la zona di memoria allocata per contenere la string di caratteri è a sola lettura // printf("hello2 = %s\n", hello2); //hello2[0] = 'H'; // ERRORE: non posso modificare la zona di memoria a cui punta hello2 //printf("hello2 = %s\n", hello2); printf("bye!\n"); } void leggi_singolo_char() { int ch; printf("questo programma legge un singolo carattere da stdin (file descriptor 0)\n"); ch = getchar(); if (ch == EOF) { // End Of File: EOF printf("condizione End Of File\n"); } printf("ch = %d\n", ch); } void leggi_da_stdin_fino_a_eof() { // modifichiamo il programma: // vogliamo che legga tutti i caratteri da file descriptor 0 fino a quando non incontriamo EOF int ch; // quando il programma legge da terminale: // ctrl-d : comunica EOF al programma int counter = 0; // vogliamo contare il numero di caratteri letti ch = getchar(); while (ch != EOF) { counter++; printf("ch = %d\n", ch); ch = getchar(); } // se sono qui, ch == EOF printf("ho finito di leggere da file descriptor 0\n"); printf("ho letto %d caratteri\n", counter); } void usa_putchar_per_scrivere_stringa() { char hello1[] = "12345"; // la stringa è terminata dal char con valore 0 // la dimensione dell'array hello1 è nota a tempo di compilazione // usiamo putchar() per scrivere la stringa di caratteri hello1 su stdout for (int i = 0; hello1[i] != 0; i++) { putchar(hello1[i]); } putchar(10); for (int i = 0; i < sizeof(hello1)-1; i++) { putchar(hello1[i]); } putchar(10); //char * ptr; // cosa accade? in ptr viene scritto.... l'indirizzo di hello1 // l'indirizzo del vettore hello1, ovvero l'indirizzo di hello1[0] for (char * ptr = hello1; *ptr != 0 ; ptr++) { putchar(*ptr); } } void copia_di_file() { // Kernighan&Ritchie pag. 16 // il programma ricopia su stdout tutto ciò che legge da stdin, un carattere alla volta // usiamo getchar() e putchar() assieme // il programma termina quando incontra EOF su stdin int ch; ch = getchar(); while (ch != EOF) { putchar(ch); ch = getchar(); } // si può riscrivere in maniera più compatta: while ( (ch = getchar()) != EOF ) { putchar(ch); } } void test_function(int a, int b) { a = 100; b = 200; } void test_function2(int * a) { *a = 1234; } void test_function3(int vettore_param[], int length) { vettore_param[0] = vettore_param[0] + 100; } int main() { // int getchar(void); // getchar legge un singolo carattere dal file descriptor 0 // quando il programma è invocato dalla shell, questa prepara tre file handler, // che corrispondo a stdin, stdout, stderr // int putchar(int c); // vogliamo leggere un numero intero da stdin int val = -1; int m = 1, n = 2; test_function(m, n); // i parametri sono passati "per valore" (copia temporanea) // qui: m == 1, n == 2 test_function2(&val); // qui: val == 1234 int vettore_int[10] = { 1,2,3 }; test_function3(vettore_int, 10); printf("vettore_int[0] = %d\n", vettore_int[0]); // chiediamo a scanf di scrivere in val il valore numerico che leggerà da stdin int res = scanf("%d", &val); printf("scanf ha letto %d valori\n", res); printf("scanf ha letto da stdin il valore: %d\n", val); return 0; }