Newsgroup: it.comp.lang.c++
Titolo: array di caratteri

salve, ho uno strano problema ,dopo aver inizializzato un'array di caratteri
in una procedura di un programma per windows,ad esempio
char stringa[255];
mi capita che subito dopo questa inizializzazione l'array risulti "sporcato"
da dei caratteri estranei ,e devo quindi "ripulirlo" con una funzione che ho
scritto rimettendo nell'array tutti caratteri \0,altrimenti mi darabbe dei
problemi .
Questo problema non avviene perň se inizializzo l'array globalmente e quindi
non in una funzione.
Sapete Darmi una dritta?
grazie

Sapete Darmi una dritta?
E' normalissimo che sia cosě.
Le variabili globali o statiche vengono automaticamente riempite con 0,
mentre quelle locali no, e bisogna inizializzarle a mano. In C++ credo che
basti (ma non sono assolutamente sicuro, non so nemmeno se compili) una cosa
del tipo:
char parola[1024] = {'\0'};
per inizializzare tutti gli elementi a '\0'.
In alternativa č comodo usare memset, in questi casi.
Se usi il C++, e vuoi un consiglio d'amico, lascia stare gli array di
caratteri e passa alla classe string, ti risolvi un bel po' di mal di testa.
Lanugo

Sapete Darmi una dritta?
char stringa[255] = {0} ;
--
Andrea Laforgia (ICQ 87230455)
http://www.geocities.com/AndreaLaforgia
"ci sono tre tipi di persone nel mondo : quelli che
 sono bravi in matematica e quelli che non lo sono."

 \0,altrimenti mi darabbe dei problemi .
E' il comportamento standard; l'inizializzazione di default per il tipo 
char e' ... non fare nulla; il fatto che se l'array viene dichiarato 
globalmente sia inizializzato a zero e' un comportamento NON garantito da 
tutti i compilatori c/c++;
L'unica soluzione e' l'inizializzazione esplicita a zero con un qualcosa 
del tipo:
#include <string.h>
[....]
char array[999];
bzero( array, sizeof( array ) );

 per inizializzare tutti gli elementi a '\0'.
Non tutti. Solo il primo.
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

 tutti i compilatori c/c++;
Se non lo fanno contravvengono allo standard. Tra l'altro sarei molto
stupito che fosse cosi', perche' il C si comporta in questo modo dalla
notte dei tempi.
Ciao,
Nicola

Se specifichi un numero di valori iniziali inferiori al numero di
elementi gli altri vengono inizializzati a zero. Resta il fatto che non
sono convinto che la sintassi di inizializzazione statica sia
applicabile ad array locali a funzioni.
Ciao,
Nicola

 Non tutti. Solo il primo.
Tutti.  Se ci sono meno inizializzatori che elementi dell'array i
restanti sono zero (o meglio, all-bits-zero).
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it
The instructions said to use Windows 98 or better - so I installed FreeBSD.

Non tutti. Solo il primo.
Ho controllato, in C++ tutti.
Lanugo

 char stringa[255] = {0} ;
Questo metodo va bene se sono variabili globali; mentre se sono locali non 
va piu' bene.

 va piu' bene.
No.  E' una normale inizializzazione che puo' essere applicata a
qualunque array di variabili di qualunque tipo.  Stroustrup3 pag. 89,
K&R2 pag. 86.


>bzero( array, sizeof( array ) );
bzero() non è parte della libreria standard, al posto si può utilizzare
memset().
Lanugo

va piu' bene.
Dove l'hai letto ? sullo Schildt ? :)
Non e' vero.  Va bene sempre.

Non tutti. Solo il primo.
Tutti.

del tipo:
Non e' vero.

Ho controllato, in C++ tutti.
Anche in C.

Goffredo Baroncelli wrote:
vabbe' ho detto una castroneria ....

 wrote in message
news:3A9FCAF9...@divalsim.it...

Ho verificato. Se il numero di inizializzatori e' inferiore al numero degli
oggetti dell'aggregato, gli oggetti restanti non vengono "zero initialized" ma
"default initialized". Pero' le due cose, nel caso dei char sono equivalenti
dato che la l'inizializzazione di default e' definita come inizializzazione a
zero per i tipi predefiniti (compreso, ovviamente, char).
Riguardo alla sintassi di inizializzazione statica, come la chiami tu, e'
applicabile. Lo standard non parla di inizializzazione statica o meno. Parla di
inizializzatori che sono permessi per tutti i casi in cui esiste un
"declarator". Anzi, stando a quello che ho capito pare che il concetto di
"initializer" si applici anche in contesti sintattici diversi da uello del
dichiaratore (esempio parametro per una chiamata a funzione o inizializzazione
del valore di ritorno).
--



Scusate sono un novello che sta studiando sul "Lippman 3^ ed." non
oserei rispondere al "collega" in merito alla domanda posta, magari
vorrei sapere se è corretto ciò che sto affermando:
- inizializzo un vettore in questo modo:
vector< int > azzera( sizeOfArray, 0);
- poi mi faccio un ciclo for per copiare gli elementi singolarmente
nell'array.
Vi prego di non ridere troppo se ho detto ca##ate  (tutti prima di
imparare a camminare andavano a quattro zampe, io per ora striscio per
poter un giorno zoppicare :-)))))
Il ragionamento è completamente sbagliato? O forse è un po troppo
macchinoso (beh l'ho detto che sono all'inizio), magari devo
continuare a studiare piu' a fondo il libro visto che non ho una
"profondita' di ragionamento"?
Saluti, Enzo.

Non vale la pena. Come fa notare Andrea Ferro in un altro messaggio, e'
sempre possibile inizializzare un array con la sintassi
int array[10] = { 0 };
Anche se l'array e' locale a una funzione.
Ciao,
Nicola



Ciao Nicola, lo so è normale che è immediato farlo in questo modo, ma
metti caso che non fosse stato possibile, è corretto come l'ho fatto?
Piu' che altro voglio rendermi conto se sto capendo qualcosa...
grazie e 
Saluti, Enzo.

Si e' corretto, anche se e' forse persino piu' usuale fare il contrario,
cioe' inizializzare il vettore a partire dall'array. Pensa di avere:
class A {
  static const std::vector<int> v;
};
Per inizializzare il vettore posso fare
int a[] = { 1, 2, 3, 4, 5 };
const std::vector<int> v(a,a+5);
Anzi, in questo caso non ci sono molte alternative.
Ciao,
Nicola