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

Codice: Seleziona tutto

delete[] p;
ma:

Codice: Seleziona tutto

free ((void*)p);

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:

Codice: Seleziona tutto

scanf("%19s",cognome);
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