[C] Lavorare con le stringhe

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Avatar utente
Berghem
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2265
Iscrizione: giovedì 14 aprile 2005, 22:28
Località: Dalmen

[C] Lavorare con le stringhe

Messaggio 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);
}
Ultima modifica di Berghem il sabato 16 giugno 2007, 22:50, modificato 1 volta in totale.
max.achille
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 349
Iscrizione: venerdì 11 maggio 2007, 0:01

Re: [C] Lavorare con le stringheHo

Messaggio 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 >:(
Avatar utente
Berghem
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2265
Iscrizione: giovedì 14 aprile 2005, 22:28
Località: Dalmen

Re: [C] Lavorare con le stringheHo

Messaggio 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....
max.achille
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 349
Iscrizione: venerdì 11 maggio 2007, 0:01

Re: [C] Lavorare con le stringheHo

Messaggio 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!
Avatar utente
Berghem
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2265
Iscrizione: giovedì 14 aprile 2005, 22:28
Località: Dalmen

Re: [C] Lavorare con le stringheHo

Messaggio 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.....
max.achille
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 349
Iscrizione: venerdì 11 maggio 2007, 0:01

Re: [C] Lavorare con le stringheHo

Messaggio 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!!
Avatar utente
Berghem
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2265
Iscrizione: giovedì 14 aprile 2005, 22:28
Località: Dalmen

Re: [C] Lavorare con le stringheHo

Messaggio da Berghem »

ok, ti ringrazio, uso i vettori....
Avatar utente
bite
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3798
Iscrizione: sabato 19 maggio 2007, 22:10

Re: [C] Lavorare con le stringheHo

Messaggio 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
Avatar utente
bite
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3798
Iscrizione: sabato 19 maggio 2007, 22:10

Re: [C] Lavorare con le stringheHo

Messaggio da bite »

Scusa, la forza dell'abitudine... Non

Codice: Seleziona tutto

delete[] p;
ma:

Codice: Seleziona tutto

free ((void*)p);
Avatar utente
menelicte
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 596
Iscrizione: lunedì 4 giugno 2007, 0:04

Re: [C] Lavorare con le stringheHo

Messaggio 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
"Tentare è il primo passo verso il fallimento" Homer J.
Avatar utente
Berghem
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2265
Iscrizione: giovedì 14 aprile 2005, 22:28
Località: Dalmen

Re: [C] Lavorare con le stringhe

Messaggio 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?
Avatar utente
menelicte
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 596
Iscrizione: lunedì 4 giugno 2007, 0:04

Re: [C] Lavorare con le stringhe

Messaggio 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
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.
Avatar utente
Berghem
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2265
Iscrizione: giovedì 14 aprile 2005, 22:28
Località: Dalmen

Re: [C] Lavorare con le stringhe

Messaggio da Berghem »

grazie, era la seconda, ma perchè senza '&' prima di cognome?
Avatar utente
menelicte
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 596
Iscrizione: lunedì 4 giugno 2007, 0:04

Re: [C] Lavorare con le stringhe

Messaggio 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)
"Tentare è il primo passo verso il fallimento" Homer J.
Avatar utente
Berghem
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2265
Iscrizione: giovedì 14 aprile 2005, 22:28
Località: Dalmen

Re: [C] Lavorare con le stringhe

Messaggio da Berghem »

tks
Avatar utente
menelicte
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 596
Iscrizione: lunedì 4 giugno 2007, 0:04

Re: [C] Lavorare con le stringhe

Messaggio da menelicte »

dnd
"Tentare è il primo passo verso il fallimento" Homer J.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti