/* File: stringhe.c */ /* Time-stamp: "2001-04-27 19:11:12 calvanes" */ /* Scopo: illustrazione dell'uso delle stringhe in C */ #include<stdio.h> #include<stdlib.h> /* per array dinamici */ int main(void) { int i; /* Una stringa e` un array di caratteri che contiene la sequenza di caratteri che forma la stringa seguita dal carattere speciale di fine stringa: '\0'. */ char stringa1[10] = {'p', 'i', 'p', 'p', 'o', '\0'}; /* Invece il seguente array di caratteri non e` una stringha perche' non termina con '\0' */ char non_stringa1[2] = {'p', 'i'}; /* Una stringa puo` essere inizializzata utilizzando una stringa letterale */ char stringa2[] = "pippo"; /* Si noti che stringa2 e` un array *statico* di 6 caratteri: {'p', 'i', 'p', 'p', 'o', '\0'} */ /* E' possibile memorizzare una stringa in un array di caratteri dinamico */ char* buffer = malloc(80 * sizeof(char)); /* In questo caso, come per tutti gli array dinamici, non possiamo inizializzare l'array contestualmente alla sua creazione */ /* Possiamo anche scrivere: */ char* buffer2; buffer2 = "pippo"; /* si noti che con questa assegnazione abbiamo assegnato a buffer2, di tipo char*, la stringa costante "pippo", di tipo char* costante. Quindi l'istruzione */ /* buffer2[0] = 't'; */ /* Da` errore in esecuzione poiche' stiamo cercando di cambiare un carattere costante. Quest'istruzione non da` errore di compilazione perche' il compilatore non puo` in generale determinare se a buffer2 era stato assegnato un puntatore a una zona di memoria costante, oppure un puntatore ad una zona di memoria variabile. */ /* Per stampare o leggere una stringa si deve utilizzare lo specificatore di formato "%s" */ printf("%s\n", stringa1); printf("%s\n", non_stringa1); /* nota: non e' una stringa! */ printf("%s\n", stringa2); printf("%s\n", buffer2); printf("Inserire una stringa lunga al piu` 80 caratteri:\n"); scanf("%s", buffer); /* Usando lo specificatore di formato "%s" vengono letti da input i caratteri in sequenza fino a trovare il primo carattere di spazio bianco (spazio bianco, tab, interlinea, ecc.). Tutti i caratteri fino allo spazio escluso vengono messi dentro il vettore buffer. Al posto del carattere di spazio bianco viene posto il carattere '\0'. Il vettore DEVE essere sufficientemente grande da contenere tutti i caratteri letti, incluso il carattere '\0'. Si noti che non si usa &buffer ma direttamente buffer! Questo perche' buffer, essendo di tipo char*, e` gia` un indirizzo. */ printf("%s\n", buffer); /* Per manipolare la stringa si deve accedere ai singoli caratteri singolarmente. Ad esempio: */ i = 0; while (buffer[i] != '\0') { /* fai qualcosa con buffer[i], ad esempio: */ printf("%c\n", buffer[i]); i++; } return 0; }