Newsgroup: it.comp.lang.c
Titolo: Ma dov'è l'errore in queste stringh e?

Salve... so che sto sbagliando io (è ovvio) ma non riesco a capire l'errore:
#include <conio.h>
#include <string.h>
int main(int argc, char *argv[])
{
   char s[]="\0", s2[]="\0";
   strcat(s,"ciao\0");
   strcat(s,"pippo\0");
   cprintf("%s",s);
   getchar();
   return 0;
};
Va tutto bene ma quando il programma deve terminare e deve tornare il 
dev-c++ il programma va in crash con problemi nella memoria.
Quindi cosa sbaglio?
Ho notato che se inizializzo le due stringhe con "\0" l'errore compare.
Se le inizializzo con qualcos'altro ("a\0", "ciao\0") allora nessun errore.
Ndò sbajo?
Thx in anticipo!
-- 
Nella vita una sola cosa è certa: se la storia ci ha insegnato qualcosa, 
è che si può uccidere chiunque. (Micheal Corleone)

 Thx in anticipo!
ciao ..
-- 
#include <stdio.h>
int main(void){char c[]={10,65,110,116,111,110,105,111,32,98,97,114,98,111,110,
101,32,60,104,105,110,100,101,109,105,116,64,116,105,115,99,97,108,105,110,101,
116,46,105,116,62,10,10,0};printf("%s",c);return 0;}

Beh che s fosse vuota (0 bytes) all'inizio lo intuivo, ma dato che 
dichiarando:
	char s[]="pippo\0";
e facendo:
	strcat(s,"qwertyuiop");
non mi veniva dato nessun errore, ho pensato che ad s viene dato spazio 
finchè ne serve ad ogni strcat. Quindi perchè non fare questo anche con 
s nulla fin dall'inizio?
Ora però ho fatto in questo modo:
	char s[]=" ";  //inizializzo con un blank
e quindi nel programma per non tener conto di quel blank iniziale ho 
fatto un bel:
	strcpy(s,"quellochedicoio");
in modo da avere sempre la stringa inizializzata a modo mio.
Ma possibile che strcat non riesca ad aggiungere stringhe ad una stringa 
nulla? Devo per forza inizializzarla con qualcosa?


 nulla? Devo per forza inizializzarla con qualcosa?
Scusa la franchezza, ma ci sono delle cose che se cerchi
di impararle a tentativi, invece di leggere un manuale,
ci metterai tutta la vita.
Non ci sono stringhe dinamiche in C, a meno che non te le
definisci tu in qualche modo.
se fai
char pippo[]='\0';
stai definendo un array di caratteri (pippo) che contiene
esattamente un elemento (in posizione pippo[0]) e questo
carattere vale 0 (che in generale indica il terminatore
delle stringhe di caratteri).
Quindi tu, a tempo di compilazione, hai riservato uno
spazio di 1 byte per l'array pippo. Di fatto puoi
memorizzarci solo la stringa vuota, perche' ogni altra
stringa occupa ovviamente almeno 2 byte.
Quindi quando fai una strcat o una strcpy di una stringa
qualunque non nulla di fatto eccedi la lunghezza della
stringa che pippo puo' contenere. Questo e' male e quando
sei fortunato ti causa un crash immediato del programma o
del computer. Quando sei sfortunato il programma funziona
ugualmente fino a che non lo consegni ad un cliente...
Se vuoi "allungare" una stringa a tempo di esecuzione,
non puoi definirla come un array,
cioe' staticamente come
char pluto[4444]; o
char etabeta[]="otorinolaringoiatria";
perche' cosi' gli array sono statici e non li puoi
ridimensionare a run-time,
ma devi fare qualcosa del tipo:
char *pippo;
pippo = malloc(80);
strcpy(pippo,"Devo studiare urgentemente la funzione malloc");
se poi la lunghezza di pippo non ti basta allora
puoi "allungarla" usando una realloc:
pippo = realloc(pippo, 200);
strcat(pippo," e devo anche studiare la realloc e la free");
oppure, invece di usare la realloc, puoi usare una free(pippo)
e poi un'altra malloc. Ma prima bisogna che prendi in mano
un testo e ti chiarisci le idee sulla gestione della
memoria e sull'uso dei puntatori.
ciao,
g.

 };
togli anche il ; alla parentesi graffa che chiude main

 g.
ciao
Darkbyte


 "pippo\0"
ti hanno gia' risposto gli altri, io mi limito a dire che quando ti e' stato
detto:
"In "C" una stringa e' un array di char terminato da '\0'."
hai frainteso!
Non devi scrivere "ciao\0", ma basta "ciao".
Infatti "ciao" non e' altro che {'c', 'i', 'a', 'o', '\0'}.
Stessa cosa per "\0", "" e' quello che ti serve!
Con "\0" in realta' ottieni due '\0' e non ti serve!
Tommy

 Tommy
Darkbyte


 stringa occupa ovviamente almeno 2 byte.
E... ad ogni modo questo crea una stringa che occupa 2 bytes e non uno!
Infatti la stringa vuota non e' "\0" ma bensi' "" .
E' infatti e' "" che occupa un solo byte.
Si puo' ottenere esattamente quello che dici tu ma con:
char pippo[] = { '\0' };
Leggendo ora la tua descrizione (riferendola a questa dichiarazione) allora
suona perfetta ;-)
Tommy

 bisogno.
Nessuna funzione di libreria del C prende di tali iniziative.

 suona perfetta ;-)
No, ho proprio fatto confusione tra le varie cose. Nella testa mi
raffiguravo uno scenario ma poi scrivevo altro...
(Promemoria per me stesso: quando sei di fretta, astieniti...)
ciao,
g.

 Vabè allora ne farò a meno d'ora in avanti.
In realtà, penso che infilare uno '\0' in più in una stringa non ti crei
alcun problema.
Resta il fatto che è assolutamente inutile, come pure è inutile concatenare
una stringa con una stringa nulla...
Marcello
---
--
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (
http://www.grisoft.com
).
Version: 6.0.587 / Virus Database: 371 - Release Date: 12/02/2004