Pagina 1 di 1
[C] Lavorare con le stringhe
Inviato: sabato 16 giugno 2007, 21:48
da Berghem
Premesso che non conosco molto il C, ho fatto la seguente funzione, vorrei salvare in una stringa il valore immesso dall'utente, ma qualcosa non funziona....
void Ricerca(){
char *cognome;
char *p;
int i = 0;
p = cognome;
printf("Nominativo da cercare : ");
*cognome = getchar();
while (*cognome == '\n'){
*cognome++;
*cognome = getchar();
}
*cognome = '/0';
printf("\n%s",p);
}
Re: [C] Lavorare con le stringheHo
Inviato: sabato 16 giugno 2007, 21:53
da max.achille
Uhm ci sono molti molti errori... (mad) Il principale è che dichiari le variabili dove memorizzare come puntatori a caratteri (che va anche bene!) ma non allochi lo spazio per poi memorizzare i dati letti!!! Questo ti manda in seg. fault appena inizi a leggere un dato.. Anche la lettura con getchar().. molto meglio una scanf!
char nome[20]; //dichiari una variabile nome di AL MASSIMO 20 caratteri, nome è un puntatore al primo elemento dell'array
char *p; //questo per come lo usi può essere solo un puntatore a carattere..
scanf("%s\n",nome);
p=nome;
printf("%s\n",p);
quel codice dovrebbe andare a meno di mie distrazioni.. come vedi è molto diverso, ti suggerisco di dare una buona lettura ai puntatori prima di procedere, visto anche che la riga *cognome++; non ha molto senso >:(
Re: [C] Lavorare con le stringheHo
Inviato: sabato 16 giugno 2007, 22:02
da Berghem
Effettivamente mi sono scordato di usare malloc, ma l'intenzione di *cognome++ era per spostare avanti di un carattere il puntatore per poi salvare un altro carattere con getchar(), mentre il puntatore p punta sempre all'inizio della stringa.....
almeno questa è la mia idea....
Re: [C] Lavorare con le stringheHo
Inviato: sabato 16 giugno 2007, 22:07
da max.achille
ok con *cognome++ se ad esempio la lettera con cui comincia la parola è una 'a' ti diventa una 'b' perchè hai sommato al valore puntato da cognome (la prima lettera letta) 1, e passi quindi al prossimo carattere ascii! Fico il C vero??? (rotfl) Per fare quello che vuoi tu, dopo aver fatto la malloc dovresti fare qualcosa come
Codice: Seleziona tutto
char cognome[20];
i=0;
while (qualcosa..) {
cognome[i]=getchar();
i++;
}
controllando ovviamente nel while oltre alla pressione dell'invio di non andare oltre i 20 caratteri massimi di cognome
e occhio che, visto che non usi una scanf, dovrai mettere tu, alla fine della stringa, il terminatore standard \0
Spero di essermi espresso decentemente, fare amicizie con le strinbghe in C è difficile all'inizio!
Re: [C] Lavorare con le stringheHo
Inviato: sabato 16 giugno 2007, 22:14
da Berghem
Si, cosi lo so fare, ma non volevo usare vettori, perchè sono dimensionati, mi ero illuso che si potesse fare con i puntatori.....
Re: [C] Lavorare con le stringheHo
Inviato: sabato 16 giugno 2007, 22:18
da max.achille
no, i puntatori devono comunque puntare a una cella di memoria preallocata e quindi sono "dimensionati" anchr loro!! Hai allora due possibilità per quello che vuoi fare tu: reallocare il giusto spazio OGNI volta che inserisci un nuovo carattere, mi pare la funzione sia realloc, o utilizzare una lista di caratteri, ma le cose si complicano MOOLTO!!
Re: [C] Lavorare con le stringheHo
Inviato: sabato 16 giugno 2007, 22:26
da Berghem
ok, ti ringrazio, uso i vettori....
Re: [C] Lavorare con le stringheHo
Inviato: sabato 16 giugno 2007, 22:26
da bite
max.achille ha scritto:
ok con *cognome++ se ad esempio la lettera con cui comincia la parola è una 'a' ti diventa una 'b' perchè hai sommato al valore puntato da cognome (la prima lettera letta) 1, e passi quindi al prossimo carattere ascii!
No, ++ ha più priorità dell'indirezione. Per trasformare la 'a' in 'b' bisognerebbe scrivere (*cognome)++
Piuttosto c'è da dire che per incrementare basta scrivere cognome++, non c'è bisogno di altro.
Secondo me con queste modifiche il codice di Berghem dovrebbe funzionare:
Codice: Seleziona tutto
void Ricerca(){
char *cognome;
char *p;
/* int i = 0; a che serve? a niente */
cognome = (char*)malloc[100];
p = cognome;
printf("Nominativo da cercare : ");
*cognome = getchar();
/* while (*cognome == '\n'){ */
while (*cognome != '\n'){
*cognome++;
*cognome = getchar();
}
*cognome = '/0';
printf("\n%s",p);
delete[] p;
}
almeno finché non ci butti dentro 100 caratteri.
Comunque è vero che scanf è più comoda.
Ciao
Re: [C] Lavorare con le stringheHo
Inviato: sabato 16 giugno 2007, 22:28
da bite
Scusa, la forza dell'abitudine... Non
ma:
Re: [C] Lavorare con le stringheHo
Inviato: sabato 16 giugno 2007, 22:45
da menelicte
se vuoi l'allocazione esatta devi fare qualcosa del genere
Codice: Seleziona tutto
typedef struct carattere{
char ascii;
struct carattere next;
} Carattere
free_list(Carattere *current)
{
if (current!=NULL)
free_list(current->next);
free(current);
}
main()
{
Carattere *start, **cur;
char *cognome, c;
cur=&start;
for (cur=&start, i=0;(c=getchar())!='\n'; cur=&((*cur)->next), i++)
{
*cur=malloc(sizeof(Carattere));
(*cur)->ascii=c;
(*cur)->next=NULL;
}
cognome=malloc(sizeof(char)*i);
for(i=0, cur=&start; *cur!=NULL; cur=&((*cur)->next), i++)
cognome[i]=(*cur)->ascii;
free_list(start);
}
ma non so quanto ne valga la pena
Re: [C] Lavorare con le stringhe
Inviato: lunedì 18 giugno 2007, 15:07
da Berghem
Alla fine ho optato per usare le stringhe come vettori, ma ora ho un problema, se ho una variabile
char cognome [20]
poi ho il seguente codice
printf("Cognome : ");
scanf("%s",&cognome);
se il cognome ha al più 20 caratteri tutto va bene, ma se l'utente inserisce 25 caratteri ho un overflow, come posso ovviare a questo problema?
Re: [C] Lavorare con le stringhe
Inviato: lunedì 18 giugno 2007, 15:13
da menelicte
vuoi avere i 25 caratteri o ovviare all'overflow?
per la prima devi per forza usare una gestione dinamica
per la seconda usa:
senza '&' prima di cognome
Re: [C] Lavorare con le stringhe
Inviato: lunedì 18 giugno 2007, 16:04
da Berghem
grazie, era la seconda, ma perchè senza '&' prima di cognome?
Re: [C] Lavorare con le stringhe
Inviato: lunedì 18 giugno 2007, 16:16
da menelicte
perchè '&' lo usi per passare a scanf un puntatore alla variabile (così scanf può modificarne il contenuto)
ma cognome è già un puntatore e quello che scanf deve modificare sono i caratteri puntati
"%s" come "%c" richiede un puntatore a carattere, ma mentre il secondo scrive solo il carattere puntato, il primo scrive il carattere puntato e i successivi (compreso il '\0' di terminazione)
Re: [C] Lavorare con le stringhe
Inviato: lunedì 18 giugno 2007, 16:23
da Berghem
tks
Re: [C] Lavorare con le stringhe
Inviato: lunedì 18 giugno 2007, 16:32
da menelicte
dnd