PDA

Visualizza la versione completa : [C] Contare il numero di valori presenti in un array


PJ123
02-04-2011, 20:56
So già che questa domanda la fanno di continuo, ma io non ci sono ancora riuscito.
Dunque.. Il linguaggio è C, e ho un array di caratteri di cui non conosco quante posizioni sono occupate.
Quando ho dichiarato l'array gli ho assegnato 50 posizioni, però i caratteri vengono dati in input dall'utente, quindi l'array ha un numero di valori variabile.

Ho letto di questa funzione presente in stdio.h:

sizeof(array)/sizeof(array[0])
però non fa al caso mio, perché riporterebbe il numero di posizioni assegnate in memoria, e quindi dovrebbe stamparmi 50, ma io voglio conoscere le posizioni "occupate", con un valore diciamo :(

Dopo una serie di tentativi sono arrivato a questa conclusione, funzionante:


int conta=0;
while(array[conta]){
conta++;
}

Non sapevo neanche che si potesse fare, è stato un errore fortunato.
Penso che si possa interpretare così: Finché array[conta] esiste (ha un valore), incrementa conta.
Alla fine stampando conta ho il numero di valori.

Però non è il massimo in quanto ad "eleganza", e il mio prof sembra non gradire..
Gli ho chiesto se in qualche libreria fosse presente una funzione che facesse al caso mio, e mi ha parlato del sizeof, che non ha risolto nulla.
Ehm... La fatidica domanda: Esiste, in qualche libreria, una funzione del genere?

Al mio prof non va bene che io definisca da solo le funzioni perché non le ha ancora spiegate :facepalm:

YuYevon
02-04-2011, 23:17
sizeof non è una funzione, ma un operatore (http://en.wikipedia.org/wiki/Sizeof) del linguaggio.

La soluzione che hai trovato tu può funzionare solo se hai esplicitamente azzerato il contenuto dell'array prima di riempirlo con i valori (perché nel momento dell'allocazione non hai alcuna garanzia che i valori iniziali siano tutti 0) e se l'utente inserisce solo ed esclusivamente valori diversi da 0; in tal caso, ti basterà cercare il primo elemento proprio uguale a 0 per determinare la fine dell'array "effettivo". In generale comunque l'unica soluzione è quella di segnare la fine dell'array con un valore "convenzionale" dopo l'immissione dei dati, anche se in realtà viene da chiedersi se non hai modo di sapere quanti valori ha immesso l'utente, o a quale indice dell'array è arrivato... come avviene l'immissione dei dati?

MacApp
04-04-2011, 00:30
Originariamente inviato da PJ123
Quando ho dichiarato l'array gli ho assegnato 50 posizioni, però i caratteri vengono dati in input dall'utente, quindi l'array ha un numero di valori variabile.


Hai praticamente solo due possibilità:
contare runtime i caratteri immessi dall'utente e portarti in giro quel valore;
(come ti ha detto YuYevon) bruciare uno dei valori possibili, assegnandogli il significato di fine array, previa inizializzazione di tutto l'array a quel valore!


con sizeof puoi solo ottenere risultati a compile time, non runtime.

p.s. in realtà ci sono anche altri metodi: una sequenza di caratteri terminatori; ad esempio c'è una funzione della microsozz (non ricordo quale) che restituisce una lista di stringhe separate da 0 e terminata da 00;
Una pascal string, in cui il primo byte trasporta la lunghezza dell'array stesso (ovvio limitato a 255 elementi);
Una qualunque altra grammatica, che permetta di dedurre dal contenuto dell'array stesso, la sua fine (ad esempio vedi il formato tar, o robe del tipo.. <string>your string</string>, ecc.. ecc..)

PJ123
04-04-2011, 01:31
Il problema è che l'array è una stringa di caratteri, quindi non ha nessun indice, e non è una sequenza di dati immessa in input.
E' una semplice parola che viene richiesta in input, quindi l'array viene caricato "tutto in una volta"..

Non so se mi sono spiegato, non sono ancora pratico di questa terminologia :spy:
Detto molto banalmente, in input viene richiesta una stringa di caratteri che assegna all'array pippo, come faccio a sapere quanto è lunga quella parola? :dottò:

MItaly
04-04-2011, 01:49
Le stringhe C sono convenzionalmente terminate dal carattere 0. In questa maniera è possibile determinarne la lunghezza scorrendo l'array e fermandosi quando si incontra uno zero, che per inciso è ciò che fa il tuo ciclo while (la condizione che ci hai messo significa "finché il valore è vero", e vero in C è "diverso da zero").
La funzionalità di quel while è fornita dalla funzione di libreria strlen, del file <string.h>·

MacApp
04-04-2011, 02:13
Originariamente inviato da PJ123
Detto molto banalmente, in input viene richiesta una stringa di caratteri che assegna all'array pippo, come faccio a sapere quanto è lunga quella parola? :dottò:
come fa a dirti colui che inserisce la stringa, che ha terminato di inserirla? Potrebbe essere un ENTER, ma di fatto dipende dal contratto tra te e chi inserisce la stringa.

PJ123
08-04-2011, 00:16
Ecco, strlen della libreria string.h
Era proprio quello che cercavo :)
Grazie a tutti per le risposte :zizi:

Loading