Linguaggio C: char stringa[]

di il
3 risposte

Linguaggio C: char stringa[]

Ciao a tutti, spero vogliate aiutarmi a risolvere questo mio ennesimo dubbio. Sto studiando le stringhe come vettori di tipo char. Per testarne il funzionamento ho scritto il seguente programma:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
  char serie[10];//dichiarazione di un vettore di tipo char
  
  printf("\nlunghezza della stringa: %d", strlen(serie));//visualizzazione della lunghezza della stringa/vettore
  
  int i;
  printf("\nindici: ");
  for(i = 0; i < 10; i++)
  {
        printf("%3d", i);
  }
  printf("\nvalori: ");
  for(i = 0; i < 10; i++)
  {
        printf("%3c", serie[i]);
  }
  printf("\nASCII : ");
  for(i = 0; i < 10; i++)
  {
        printf("%3d", (int)serie[i]);
  }
  
  printf("\ninserisci una stringa: ");
  scanf("%s", serie);//posso inserire una stringa di qualsiasi lunghezza fino ad un carattere di spaziatura 
  //gets(serie);
  
  //stampa orizzontalmente gli indici del vettore stringa e i valori di ciascun elemento del vettore
  printf("\ncaratteri nella stringa: ");
  //int i;
  printf("\nindici: ");
  for(i = 0; i < strlen(serie); i++)
  {
        printf("%3d", i);
  }
  printf("\nvalori: ");
  for(i = 0; i < strlen(serie); i++)
  {
        printf("%3c", serie[i]);
  }
  //visualizza la lunghezza della stringa/vettore
  printf("\n\nlunghezza della stringa: %d\n", strlen(serie));
  
  system("PAUSE");	
  return 0;
}
in pratica dichiaro un vettore char con dimensione 10 e ne leggo la lunghezza. Mi aspetto 10, ma l'output è 2. Modificando il valore della dimensione del vettore, cambia il valore restituito da strlen; per esempio se dichiaro un vettore di 100 elementi, viene stampato il numero 4. Non credo di dovermi preoccupare più di tanto, l'array di char non è inizializzato e strlen conta il numero di caratteri escluso il carattere di terminazione, quindi poiché il vettore non è inizializzato, il conteggio dei caratteri può dare un risultato sbagliato, almeno credo. Ciò che invece non mi sono spiegato è perché l'utente può inserire una sequenza di caratteri più lunga rispetto alla dimensione del vettore "serie". Cioè so che scanf("%s", serie) legge una sequenza di caratteri e la memorizza nel vettore "serie" fino alla pressione di un carattere di spaziatura, ma mi aspettavo la restituzione di un errore quando il numero di caratteri inseriti superasse la dimensione del vettore "serie", oppure che il numero di caratteri memorizzati fosse pari alla dimensione del vettore - 1, riservando un elemento dell'array al carattere di terminazione. Nella prova che ho eseguito ho inserito una stringa composta dai 21 caratteri dell'alfabeto italiano. Il programma viene eseguito correttamente, nonostante la dimensione della "serie" fosse di 10 caratteri (vedi immagine "output.jpg" allegata). Se però scrivo "supercalifragilistichespiralitoso" il programma stampa l'output correttamente, ma quando premo Enter per chiudere il programma, mi restituisce un errore (vedi immagine "output 2.jpg" allegata). Cosa non ho capito? Grazie a chiunque voglia dedicarmi un po' del suo tempo.

3 Risposte

  • Re: Linguaggio C: char stringa[]

    Il C non ha meccanismi "automatici" di controllo dello "sfondamento" di un buffer, per cui quando scrivi oltre lo spazio allocato stai scrivendo in qualche "chissà dove", preparando il terreno per problemi che possono andare dall'inezia alla tragedia. Dunque, MAI scrivere oltre il limite di capacità di un buffer.

    Una funzione che permette di inserire una stringa solo fino a una determinata capacità massima è fgets(), ma la dimensione del buffer la devi esplicitare nella chiamata, non è implicita.
  • Re: Linguaggio C: char stringa[]

    Se ti chiedevi perché l'errore più comune di cui si legge in tutti i rapporti di bug è il buffer overflow... ora lo sai!

    Sono cose differenti:
    - la dimensione in byte che hai allocato per la stringa
    - il numero di byte che ci sono dentro. strlen (e varianti)
    - il numero di caratteri che ci sono dentro!
  • Re: Linguaggio C: char stringa[]

    Grazie ad entrambi per le risposte. Quando avevo eseguito la prima prova, avevo erroneamente pensato che con una stringa, lo spazio allocato in memoria venisse automaticamente "adattato" per scrivere una stringa di lunghezza n. Il programma non restituiva errore, quindi non riuscivo a spiegarmi perché nella seconda prova il programma restituisse un errore. Grazie alle vostre risposte so che entrambi i programmi sono sbagliati e che il primo si chiude correttamente solo per un caso fortuito. Grazie ancora.

    p.s. noto che sul forum manca un sistema di "reputazione", una forma di ringraziamento per quegli utenti che mettono a disposizione di altri il loro tempo e le loro conoscenze.
Devi accedere o registrarti per scrivere nel forum
3 risposte