[C] Lavorare con le stringhe
- Berghem
- Entusiasta Emergente

- Messaggi: 2265
- Iscrizione: giovedì 14 aprile 2005, 22:28
- Località: Dalmen
[C] Lavorare con le stringhe
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);
}
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);
}
Ultima modifica di Berghem il sabato 16 giugno 2007, 22:50, modificato 1 volta in totale.
-
max.achille
- Scoppiettante Seguace

- Messaggi: 349
- Iscrizione: venerdì 11 maggio 2007, 0:01
Re: [C] Lavorare con le stringheHo
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 >:(
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 >:(
- Berghem
- Entusiasta Emergente

- Messaggi: 2265
- Iscrizione: giovedì 14 aprile 2005, 22:28
- Località: Dalmen
Re: [C] Lavorare con le stringheHo
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....
almeno questa è la mia idea....
-
max.achille
- Scoppiettante Seguace

- Messaggi: 349
- Iscrizione: venerdì 11 maggio 2007, 0:01
Re: [C] Lavorare con le stringheHo
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
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!
Codice: Seleziona tutto
char cognome[20];
i=0;
while (qualcosa..) {
cognome[i]=getchar();
i++;
}
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!
- Berghem
- Entusiasta Emergente

- Messaggi: 2265
- Iscrizione: giovedì 14 aprile 2005, 22:28
- Località: Dalmen
Re: [C] Lavorare con le stringheHo
Si, cosi lo so fare, ma non volevo usare vettori, perchè sono dimensionati, mi ero illuso che si potesse fare con i puntatori.....
-
max.achille
- Scoppiettante Seguace

- Messaggi: 349
- Iscrizione: venerdì 11 maggio 2007, 0:01
Re: [C] Lavorare con le stringheHo
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!!
- Berghem
- Entusiasta Emergente

- Messaggi: 2265
- Iscrizione: giovedì 14 aprile 2005, 22:28
- Località: Dalmen
Re: [C] Lavorare con le stringheHo
ok, ti ringrazio, uso i vettori....
Re: [C] Lavorare con le stringheHo
No, ++ ha più priorità dell'indirezione. Per trasformare la 'a' in 'b' bisognerebbe scrivere (*cognome)++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!
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;
}
Comunque è vero che scanf è più comoda.
Ciao
Re: [C] Lavorare con le stringheHo
Scusa, la forza dell'abitudine... Non
ma:
Codice: Seleziona tutto
delete[] p;
Codice: Seleziona tutto
free ((void*)p);
Re: [C] Lavorare con le stringheHo
se vuoi l'allocazione esatta devi fare qualcosa del genere
ma non so quanto ne valga la pena
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);
}"Tentare è il primo passo verso il fallimento" Homer J.
- Berghem
- Entusiasta Emergente

- Messaggi: 2265
- Iscrizione: giovedì 14 aprile 2005, 22:28
- Località: Dalmen
Re: [C] Lavorare con le stringhe
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?
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
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
per la prima devi per forza usare una gestione dinamica
per la seconda usa:
Codice: Seleziona tutto
scanf("%19s",cognome);
Ultima modifica di menelicte il lunedì 18 giugno 2007, 15:30, modificato 1 volta in totale.
"Tentare è il primo passo verso il fallimento" Homer J.
- Berghem
- Entusiasta Emergente

- Messaggi: 2265
- Iscrizione: giovedì 14 aprile 2005, 22:28
- Località: Dalmen
Re: [C] Lavorare con le stringhe
grazie, era la seconda, ma perchè senza '&' prima di cognome?
Re: [C] Lavorare con le stringhe
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)
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)
"Tentare è il primo passo verso il fallimento" Homer J.
Chi c’è in linea
Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti
