purtroppo non funziona... (sono sotto linux cmq)
avevo già notato che scrivendo le stringhe non come puntatori funzionava ma io ho bisogno che siano puntatori a char![]()
purtroppo non funziona... (sono sotto linux cmq)
avevo già notato che scrivendo le stringhe non come puntatori funzionava ma io ho bisogno che siano puntatori a char![]()
P.
Il fatto è che in c le stringhe non esistono! Esistono solo puntatori a char!![]()
Così come tutti i vettori sono puntatori!
infatti a[3] è uguale ad *(a+3)
Sentite, questo funziona di sicuro, con qualunque coppia di stringhe:
Lo puoi richiamare, per esempio, così:codice:char *concat(char *a, char *b) { char *temp = new char[strlen(a) + strlen(b) + 1]; // Il +1 è per il carattere null strcpy(temp, a); strcat(temp, b); return temp; }
Se questo da Segmentation Fault, mi impicco al mio libro di C++.codice:printf("%s", concat("Ciao\n", "Vincenzo"));
Sì l'ho provato ma non con il Borland C++, ma con il Dev-Cpp e non funge.Originariamente inviato da pprllo
Sei sicuro di aver provato questo ?
E' davvero strano perchè a me Borland C++ 5.5.1 su Windows XP lo compila e funziona perfettamente ...codice:char *a = "a2a\n"; char *b = "b2b\n"; strcat(a, b); printf("%s", a);![]()
Rimane il fatto che scrivere
oppurecodice:char *c
non è la stessa cosa: il primo alloca spazio per un puntatore a carattere (4 byte solitamente) e non alloca spazio per nessnu carattere (la malloc si occupa di questo), mentre il secondo alloca sia il puntatore, sia 20 byte in memoria.codice:char c[20];
Ciao.![]()
"Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza
char *a = "ciao";Originariamente inviato da minoz
Di fatti è corretto in quanto scrivere *a ed a[] è la meddesima cosa, e solo in questo caso si fa senza specificare la dimensione in quanto viene ricavata dall'assegnamento: char *a = "a2a\n"; e viene aggiunto anche il terminatore quindi è uguale a scrivere: char a[4] = "a2a\n";
![]()
e
char a[] = "ciao";
NON sono affatto la stessa cosa.
char *a = "ciao";
dichiara 'a' come un puntatore ad una stringa costante, mentre
char a[] = "ciao";
dichiara 'a' come un puntatore costante, che contiene la stringa "ciao".
In sostanza, quando inizializzi un puntatore char* con un letterale stringa, cioè una 'parola' racchiusa tra virgolette, come "ciao", la zona puntata dal puntatore non puo essere modificata, e la sua modifica puo far scattare un segmentation fault; ad esempio:
char *c = "ciao";
c[0] = 'A';
la seconda istruzione è illegale perchè cerca di modificare un letterale stringa, mentre è legale se si dichiara c come array.
Questo significa che se vuoi concatenare non puoi dichiarare c come char* perchè la concatenazione porta a sovrascrivere il carattere di fine stringa della prima stringa con il primo carattere della stringa da concatenare; ma in ogni modo la dichiarazione con char *c è sbagliata perchè per concatenare qualcosa a 'c' questo deve già puntare ad una zona di memoria sufficientemente grande da contenere il risultato della concatenazione, ma se hai dichiarato
char *c = "ciao"
c punta ad una porzione di memoria che può solo contenere "ciao", e quindi anche per questo devi dichiarare qualkosa del tipo:
char c[20] = "ciao";
in cui allochi 20 caratteri, anche se la stringa "ciao" ne vorrebbe solo 5, perke ti derve spazio per la successiva concatenazione.
Sun Certified Java Programmer
EUCIP Core Level Certified
European Certification of Informatics Professionals
Intendevo che sono la stessa cosa nel momento in cui le richiamiOriginariamente inviato da anx721
char *a = "ciao";
e
char a[] = "ciao";
NON sono affatto la stessa cosa.
a[20] è uguale ad *(a+20)
Non quando le dichiari..
Volevo solo dire che se richiami il vettore senza parentesi questo ti indica l'indirizzo del primo elemento dell'array, per avere il suo valore devi quindi dereferenziarlo con * ed essendo contigui gli elementi dell'array basta incrementare l'indirizzo del primo per accedere agli altri elementi!![]()
Dichiarando char *c = "ciao"; non si crea una costante! si può usare la realloc(size) per incrementare lo spazio di memoria disponibile ed espandere la stringa.Originariamente inviato da anx721
char *a = "ciao";
dichiara 'a' come un puntatore ad una stringa costante, mentre
char a[] = "ciao";
dichiara 'a' come un puntatore costante, che contiene la stringa "ciao".
In sostanza, quando inizializzi un puntatore char* con un letterale stringa, cioè una 'parola' racchiusa tra virgolette, come "ciao", la zona puntata dal puntatore non puo essere modificata, e la sua modifica puo far scattare un segmentation fault; ad esempio:
char *c = "ciao";
c[0] = 'A';
la seconda istruzione è illegale perchè cerca di modificare un letterale stringa, mentre è legale se si dichiara c come array.
Di fatti
Funziona senza problemicodice:int main(int argc, char **argv){ char *ciao = "CIAO"; ciao[0] = 'c'; printf("%s\n",ciao); return 0; }
per una costante c'è da usare lo static!
Dal "The C Programming Language", di Kernighan & Ritchie (la bibbia del C):Originariamente inviato da minoz
Dichiarando char *c = "ciao"; non si crea una costante! si può usare la realloc(size) per incrementare lo spazio di memoria disponibile ed espandere la stringa.
There is an important difference between these definitions:
char amessage[] = "now is the time";
/* an array */
char *pmessage = "now is the time";
/* a pointer */
amessage is an array, just big enough to hold the
sequence of characters and '\0' that initializes it. Individual characters within the array may be changed but amessage will always refer to the same storage.
On the other hand, pmessage is a pointer, initialized to point to a string constant; the pointer may subsequently be modified to point elsewhere, but the result is undefined if you try to modify the string contents.
Quel semplice codice difatti produce un bel segmentation fault se compilato con gcc, probabilmente se usi un altro compilatore (il borland), puo darsi che non vi sia un segmentation fault, ma solo perchè il costruttore del compilatore ha agito diversamente, perche lo standard non prevede che si modifichi una costante stringa, se ciò avviene il risultato è indefinito, puo esserci un segmentation fault come no.Originariamente inviato da minoz
Di fatti
Funziona senza problemicodice:int main(int argc, char **argv){ char *ciao = "CIAO"; ciao[0] = 'c'; printf("%s\n",ciao); return 0; }
per una costante c'è da usare lo static!
Se con gcc o mingw dichiari
char *c1 = "ciao";
char *c2 = "ciao";
e poi stampi c1 e c2 non come stringhe ma come puntatori, ti accorgi che puntano alla stessa aria di memoria, proprio perchè "ciao" è una "constant string", quindi tutte le sue occorrenze nel programma fanno sempre riferimento alla stessa aria di memoria, cioè c1 e c2 puntatno alla stessa stringa, che è pure non modificabile.
Sun Certified Java Programmer
EUCIP Core Level Certified
European Certification of Informatics Professionals