Pagina 2 di 4 primaprima 1 2 3 4 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 38

Discussione: [C] Puntatori a char

  1. #11
    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.

  2. #12
    Utente di HTML.it L'avatar di minoz
    Registrato dal
    Oct 2001
    Messaggi
    219
    Il fatto è che in c le stringhe non esistono! Esistono solo puntatori a char!

  3. #13
    Utente di HTML.it L'avatar di minoz
    Registrato dal
    Oct 2001
    Messaggi
    219
    Così come tutti i vettori sono puntatori!

    infatti a[3] è uguale ad *(a+3)

  4. #14
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Sentite, questo funziona di sicuro, con qualunque coppia di stringhe:
    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;
    }
    Lo puoi richiamare, per esempio, così:
    codice:
    printf("%s", concat("Ciao\n", "Vincenzo"));
    Se questo da Segmentation Fault, mi impicco al mio libro di C++.

  5. #15
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da pprllo
    Sei sicuro di aver provato questo ?

    codice:
    char *a = "a2a\n";
    char *b = "b2b\n";
    strcat(a, b);
    printf("%s", a);
    E' davvero strano perchè a me Borland C++ 5.5.1 su Windows XP lo compila e funziona perfettamente ...
    Sì l'ho provato ma non con il Borland C++, ma con il Dev-Cpp e non funge.

    Rimane il fatto che scrivere
    codice:
    char *c
    oppure
    codice:
    char c[20];
    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.


    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

  6. #16
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    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";

    char *a = "ciao";

    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

  7. #17
    Utente di HTML.it L'avatar di minoz
    Registrato dal
    Oct 2001
    Messaggi
    219
    Originariamente inviato da anx721
    char *a = "ciao";

    e

    char a[] = "ciao";

    NON sono affatto la stessa cosa.
    Intendevo che sono la stessa cosa nel momento in cui le richiami

    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!

  8. #18
    Utente di HTML.it L'avatar di minoz
    Registrato dal
    Oct 2001
    Messaggi
    219
    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.
    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.

  9. #19
    Utente di HTML.it L'avatar di minoz
    Registrato dal
    Oct 2001
    Messaggi
    219
    Di fatti
    codice:
      
    int main(int argc, char **argv){
        	char *ciao = "CIAO";
        	ciao[0] = 'c';
      	printf("%s\n",ciao);    	
          return 0;  
    }
    Funziona senza problemi

    per una costante c'è da usare lo static!

  10. #20
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    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.
    Dal "The C Programming Language", di Kernighan & Ritchie (la bibbia del C):


    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.

    Originariamente inviato da minoz
    Di fatti
    codice:
      
    int main(int argc, char **argv){
        	char *ciao = "CIAO";
        	ciao[0] = 'c';
      	printf("%s\n",ciao);    	
          return 0;  
    }
    Funziona senza problemi

    per una costante c'è da usare lo static!
    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.

    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.