Discussioni su argomenti di Informatica
10/03/2017, 09:30
Ciao a tutti,
volevo sapere come si trova la lunghezza di un array di interi in C.
Io ho usato questo codice (che funziona per le stringhe) ma continua a darmi lunghezza 1; forse non va bene per gli interi?
int main () {
int m[10], i, lunghezza;
printf ("Inserisci i valori\n");
scanf ("%d", m);
for (i=0; m[i] != '\0'; i++) { }
lunghezza = i;
i = lunghezza;
printf ("La lunghezza è %d\n", lunghezza);
return 0;
}
10/03/2017, 12:18
Stai leggendo un solo valore da standard input.. Il fatto che ti restituisca 1 è un caso e cambiando compilatore o opzioni del compilatore potrebbe crashare. Per leggere più valori è necessario scrivere un ciclo e in quel caso è sufficiente contare il numero di iterazioni. Quello di far terminare le stringhe con '\0' è una convenzione solo delle stringhe, non è in generale utilizzabile in altre situazioni a meno di terminare esplicitamente i tuoi array con qualche valore specifico.
10/03/2017, 16:54
Ciao, grazie della risposta. Come posso trovare la lunghezza di un array di interi senza usare la libreria string.h e senza utilizzare valori particolari per terminare l'array?
10/03/2017, 20:12
In generale, non si può. Quando lavori con gli array devi portarti dietro la sua dimensione e preoccuparti di non uscire dai suoi limiti. Per array statici si può usare il metodo seguente, ma ricorda che la dimensione viene persa quando passi l'array ad una funzione.
- Codice:
#include <stdio.h>
#define UNSAFE_ARRAY_SIZE( __array__ ) ( sizeof( ( __array__ ) ) / sizeof( ( __array__[0] ) ) )
int func(int a[]);
int main(void)
{
int v[] = { 1, 2, 3, 4, 5 };
int dim = UNSAFE_ARRAY_SIZE(v);
printf("Nota che %d e' diverso da %d\n", dim, func(v));
}
int func(int a[])
{
return UNSAFE_ARRAY_SIZE(a);
}
Nota inoltre che anche con le stringhe la presenza dello 0 alla fine della stringa va gestita nel caso di funzioni scritte da te e non è assicurata.
11/03/2017, 18:23
Esistono in generale due lunghezze che possiamo associare ad un array. La prima è la quantità di memoria allocata per quel particolare oggetto. E' possibile calcolare tale quantità con il codice postato da @vict85 nel caso di array statici, ma non è in generale possibile farlo quando si ha solo accesso ad un puntatore a tale array (come avviene nel caso di passaggio dell'array ad una funzione per esempio). Il secondo concetto di lunghezza è invece associato alla frazione di array che è stata effettivamente usata. E' quello che viene calcolato con il tuo metodo per le stringhe (o usando strlen). Per questo tipo di lunghezza esistono in generale due metodi: passare la lunghezza separatamente o utilizzare un valore particolare alla fine dell'array per segnarne il termine. Personalmente credo che memorizzare le due lunghezze sia in generale una soluzione migliore, ma il linguaggio C ha fatto una scelta diversa per quanto riguarda le stringhe.
Skuola.net News è una testata giornalistica iscritta al Registro degli Operatori della Comunicazione.
Registrazione: n° 20792 del 23/12/2010.
©2000—
Skuola Network s.r.l. Tutti i diritti riservati. — P.I. 10404470014.