PDA

Visualizza la versione completa : [c] inizializzare stringhe


jc74
21-04-2010, 18:46
mi potete dare una mano?
leggevo che era possobile inizializzare le stringhe anche in questo modo
char *string="ciao"!
usare un puntatore, ma se non conosco la lughezza della stringa che va letta?
pensavo così e funziona ma credo di aver commesso un errore o quale cosa che in futuro potrà dare luogo agli errori
#include <stdio.h>
int main()
{
char*punts[0];
printf("scrivere la stringa ");
scanf("%s",punts);
fflush(stdin);
printf("%s",punts);
getchar();
return 0;
}

jc74
22-04-2010, 23:20
provo a spiegarmi,
-se dichiaro un array di puntatori char es array da 21 elementi l'ultimo è un terminatore /0 ????
credo di no perchè è un array di puntatori anche se "guardano char"
-in array di puntatori char(5 elementi) inserisco 5 stringhe noto che vengono memorizzate una di seguto all'altra


#include <stdio.h>
int main()
{
int a=0;
char*array_punts[5];
for(a=0;a<=4;a++)
{
printf("inserisci il nome ");
scanf("%s",&array_punts[a]);
fflush(stdin);
}

printf("%s",array_punts);

getchar();
return 0;
}

come posso stampare solo es il terzo nome, in sostanza non funziona


#include <stdio.h>
int main()
{
int a=0;
char*array_punts[5];
for(a=0;a<=4;a++)
{
printf("inserisci il nome ");
scanf("%s",&array_punts[a]);
fflush(stdin);
}
printf("%s",array_punts[2]);
getchar();
return 0;
}

oregon
23-04-2010, 00:36
Attenzione ... non puoi usare puntatori a stringhe senza allocare prima la memoria a cui essi puntano.

Kej
23-04-2010, 00:51
Prova a dichiarare l'array in modo statico



char array_punts[5][5];

e ti funziona.

Nel tuo codice non stai inizializzando il numero di stringhe, e quindi fai un paciocco con la gestione di esse in memoria :)


Consiglio: inizia ad istanziare la memoria per gestire queste stringhe in modo dinamico, per esempio, se nel tuo codice avessi fatto un lavoro del genere



char *array_punts[5];
array_punts = (char **)malloc(sizeof(char) * 5);


avresti risolto perchè ora il numero di stringhe è inizializzato.
Molto meglio invece se fai così



char **array_punts;
int i;

array_punts = (char **)malloc(sizeof(char) * 5); // Organizzi l'array per contenere 5 stringhe

for (i = 0; i < 5; i++)
array_punts[i] = (char *)malloc(sizeof(char) * 5); // Istanzi la lunghezza di ognuna delle 5 stringhe


Cosi ottieni un array che può contenere 5 stringhe, ognuna di lunghezza 4 (5 - carattere terminatore '\0')

jc74
23-04-2010, 13:49
Grazie davvero di cuore kej. (credo il tuo code oltre che per esrc mi servirà molto i prossimi giorni spero nel tuo aiuto!!!)
devo ancora arrivare a guardare l'allocazione!!!
ma non ho proprio modo di impedire una predeterminazione delle dimensioni array,(nella fase in cui sono) lasciando a chi esegue il compito???
stasera posterò un code per spiegarmi meglio

oregon
23-04-2010, 13:59
Originariamente inviato da jc74
ma non ho proprio modo di impedire una predeterminazione delle dimensioni array,(nella fase in cui sono) lasciando a chi esegue il compito???

Con l'allocazione dinamica ... ma tu stesso hai detto


devo ancora arrivare a guardare l'allocazione!!!

jc74
23-04-2010, 18:59
in realtà volevo farla determinare da chi mandava in esecuzione, mi spiego meglio


int a=0;
printf("inserire il numero dei valori da valutare ");
scanf("%d",&a);
fflush(stdin);
int array[a];
int b=0;
for(b=0;b<=b-1;b++)
{
printf("inserire il valore ");
scanf("%d",&array[b]);
fflush(stdin);
}

(spero di non aver commesso errori)
non so se mi sono spiegato, anche se credo che a molti una cosa del genere non piace, peraltro a tal proposito mi piacerebbe chiedere su alcuni aspetti dell'allocazione in generale come "teoria",ma do un okkio al regolamento prima di postare

Kej
23-04-2010, 19:35
Si, puoi fare una cosa del genere (se ho capito bene vuoi applicarlo ad un array di stringhe):



#define MAXLENS 50

int main() {

int nstrings;

printf("Numero di stringhe: ");
scanf("%d", &nstrings);

char array[nstrings][MAXLENS];

...
}


E' brutto da vedere, ma finchè non arrivi a studiarti l'allocazione dinamica della memoria (che è sempre la soluzione migliore, sopratutto quando tratti le stringhe) allora può andarti più che bene.

oregon
23-04-2010, 20:04
Originariamente inviato da Kej
Si, puoi fare una cosa del genere ...

Questo solo con un compilatore C99 ... e non tutti sono compatibili (oltre al fatto che non sopporto proprio questo tipo di codice ... :) )

oregon
23-04-2010, 20:06
Originariamente inviato da jc74
non so se mi sono spiegato, anche se credo che a molti una cosa del genere non piace

No che non piace ... molti compilatori protesteranno ...

Loading