/* 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;
}