|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
C e stringhe
Ho ripreso i miei vecchi studi di Informatica interrotti anni fa, e mi ritrovo alle prese col C, che ammetto sono anni che non tocco... ahi ahi ahi
Ho una domanda sulle stringhe. Esse vengono se non ricordo male viste come puntatori ad array di char. char *testo; ammettiamo che io non conosca a priori la dimensione di tale stringa. Se avessi l'esigenza di aggiungere ad es in un ciclo while un carattere alla volta, posso fare *testo+= carattere; ?? Ve lo chiedo perchè non mi da errori di compilazione, ma quando alla fine cerco di stampare la stringa con printf("la stringa è: %s",*testo); mi da un messaggio: Segmentation fault (core dumped) che significa?? Grazie e scusate (marooo come mi vergogno!!! |
|
|
|
|
|
#2 | |
|
Member
Iscritto dal: May 2003
Messaggi: 283
|
Re: C e stringhe
Quote:
Il C non è Java, non rompe le palle se uno fa delle ca****e, questo è il suo bello ma alla fine ti ritrovi con una più difficoltosa ricerca degli errori. Inoltre credo che per utlizzare printf la stringa deve essere null-termined (si dice così? boh insomma alla fine del testo deve contenere il carattere '\0' ). Ciao
__________________
/*** * Nulla è impossibile per chi non deve farlo ***/ |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Perciò devo, prima di aggiungere un carattere, rialllocare la memoria aggiungendo la dimensione di un char?
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Una cosa tipo questa prima di aggiungere il carattere alla stringa??
realloc(*testo , (strlen(testo) + 1) * sizeof(int)); |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: May 2003
Messaggi: 283
|
Scusa ma hai una necessità assoluta di aumentare di un carattere lo spazio tutte le volte????
Non puoi stimare per eccesso la dimensione della stringa e allocarla una volta soltanto???
__________________
/*** * Nulla è impossibile per chi non deve farlo ***/ |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
a parte che mi pare uno spreco, poi sto studiando, la mia non è una necessità, ma potrebbe sorgere in futuro
|
|
|
|
|
|
#7 | |
|
Member
Iscritto dal: May 2003
Messaggi: 283
|
Quote:
Cmq credo che il C++ abbia una classe string che permetta quel giochino (e alla fine credo che a te cambia poco se sia C o C++).
__________________
/*** * Nulla è impossibile per chi non deve farlo ***/ |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
SOno qui per imparare... mi spieghi meglio questa frase? "Uno spreco è allocare e copiare memoria per ogni singolo carattere ". intendi spreco di tempo? di memoria?
Ammettimo di riuscire a stimarne la dimensione, diciamo 10 elementi. char testo[10]; come aggiungo un carattere alla volta in un ciclo? Devo per forza trattarlo come array? (testo[i] = carattere) |
|
|
|
|
|
#9 | |
|
Member
Iscritto dal: May 2003
Messaggi: 283
|
Quote:
Si-No, Dipende. Se vuoi aggiungere un carattere al tuo vettore in un ciclo lo fai con testo[i]=carattere, ovvimente se devi aggiungere dei caratteri riprendi dalla prima posizione vuota e quindi devi tenere un intero quandoRobbaCHoDentro per poter continuare dalla prima "casella vuota". Cmq su un qualunque manuale di C queste cose vengono spiegate molto bene Vo' a ca', se hai altre domande ti risponderò probabilmente domani Ciao
__________________
/*** * Nulla è impossibile per chi non deve farlo ***/ |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Spreco di tempo naturalmente, con centinaia di megabyte a disposizione tu ti preoccupi di sprecare 1000 byte? Poi c'e' la questione dell'allineamento, quindi per sicurezza alloca a blocchi di potenze di 2 (es. 1024 byte alla volta)
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Quote:
Poi se qualcunoi non avesse ragionato così magari oggi non mi occorrerebbero 128 mb di RAM per fare girare programmini della mutua... |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
char *testo; testo = (char *)malloc(2 * sizeof(char)); testo[0] = 'a'; testo[1] = '\0'; //serve il carattere di fine stringa altrimenti non è una stringa testo = realloc(testo , (strlen(testo) + 2) * sizeof(char)); testo[strlen(testo)+1] = '\0'; testo[strlen(testo)] = 'b'; //nota che strlen termina al primo '\0' che trova Considera che la funzione strlen è in pratica una cosa del genere: Codice:
size_t strlen(char *s)
{
int i = 0;
while(s++ == '\0') ++i;
return i;
}
|
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Quote:
|
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Quindi conviene farlo meno frequentemente possibile... Di conseguenza ti consiglio di farlo a blocchi... Ti fai la tua bella struttura dati: Codice:
typedef stringa struct _stringa *;
struct _stringa {
char *buf;
char dim;
};
stringa creaStringa();
{
stringa s = (stringa)malloc(siezof(struct _stringa));
if(!s)
return NULL;
s->dim = 1024;
s->buf = (char *)malloc(1024 * sizeof(char));
return (s->buf)?s:NULL;
}
void eliminaStringa(stringa s)
{
free(s->buf);
s->dim = 0;
s->buf = NULL;
}
stringa insericiStringa(stringa s, const char *st)
{
if(s == NULL)
return NULL;
if(st = NULL)
return s;
if((strlen(st)+strlen(s->buf)+1) > s->dim)
{
s = (stringa)realloc(s, sizeof(char) * s->dim + 1024);
s->dim += 1024;
}
strcat(s->buf, st);
return s;
}
|
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Grazie, ora ho capito
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:30.



















