Restituire stringa da funzione

di il
15 risposte

Restituire stringa da funzione

Ciao ragazzi , sto implementando una funzione che restituisce una stringa al chiamante ma non riesco a farla funzionare.questo è il codice della funzione registrati che chiama a sua volta la funzione char *crypt che restituisce appunto un puntatore a char...vi spiego il problema. La funzione crypt elabora una stringa,che prima di restituire faccio stampare per essere sicuro che sia quella che mi serviva, e fin qui ok.quindi le dò il return, poi nella funzione chiamante,che deve salvare su file la stringa ricevuta più altri dati,se faccio stampare la stringa ritornata ho un valore strano.
Ho usato la malloc per evitare la distruzione della variabile automatica e poi la free nella funzione chiamante,ma non capisco perchè non funziona
grazie mille in anticipo!

void registrati(FILE *maindb)
{
   giocatore nuovo;
   char pass[passlenght];

   char *crypt(char []);

   printf("Quale è il tuo numero nell\'elenco della classe?");
   scanf("%d",&nuovo.id);
   printf("inserisci il tuo username : ");
   scanf("\n%[^\n]",nuovo.nome);
   printf("Inserisci una password :");
   scanf("\n%[^\n]",pass);
   nuovo.password = crypt(pass);
   printf("%s\n",nuovo.password);
   nuovo.credito = startmoney;
   fseek(maindb,(nuovo.id - 1)*sizeof(giocatore),SEEK_SET);
   fwrite(&nuovo,sizeof(giocatore),1,maindb);
   printf("***Benvenuto nel sistema, \"%s\"\n"
          "hai un credito iniziale di %.1f***\n",nuovo.nome,nuovo.credito);
   free(nuovo.password);
}

char *crypt(char pass[passlenght])
{
   int i,j;
   char temp[passlenght],ris[passlenght];
   char *passcrypt;

   passcrypt = malloc(sizeof(char *));
   for(i = (strlen(pass)),j=0 ;i >= 0 ; i--,j++)
   {
      temp[j] = pass[i-1];
      temp[j]++;
   }
   strncpy(ris,temp,strlen(pass));
   ris[strlen(pass)] = '\0';
   passcrypt = ris;
   printf("%s\n",passcrypt);
   return passcrypt;
}

15 Risposte

  • Re: Restituire stringa da funzione

    Che cosa staresti cercando di fare con questa chiamata?
    void registrati(FILE *maindb){
        ...
        char *crypt(char []);
        ...
    }
    Di che tipo è la variabile giocatore.password?
  • Re: Restituire stringa da funzione

    Hai fatto un mezzo pasticcio perché hai allocato il puntatore nell'heap facendolo puntare ad un contenuto che sta nello stack della funzione ...

    Devi allocare lo spazio per la stringa nell'heap con la malloc ...
  • Re: Restituire stringa da funzione

    Tuixte quella è la dichiarazione della funzione!
    la strutture è questa
    
    struct scommessa
    {
       char *vittima;
       double *puntata;
       double *quota;
    };
    
    struct alunno
    {
       int id;
       char nome[namelenght];
       double credito;
       char *password;
       struct scommessa *ivebet[maxbet];
    };
    
    typedef struct alunno giocatore;
    
    oregon sicuramente è pasticciato!puoi spiegarmi meglio come correggere?
  • Re: Restituire stringa da funzione

    Si ma la funzione non dovresti dichiararla all'interno di un'altra funzione...
    Poi, per quello che ti ha detto eclipse, devi copiare la stringa all'indirizzo puntato da passcrypt. Tu adesso punti a ris, che viene distrutto al termine della funzione.
  • Re: Restituire stringa da funzione

    Ti assicuro che la funzione la puoi dichiarare in qualsiasi blocco,se serve solo lì,principio del minimo privilegio
    comunque ora provo a correggere....intanto però guardate questo programmino che ho scritto per provare....qui la stringa viene passata senza nessuna malloc...e funziona perfettamente!
    
    #include <stdio.h>
    
    main()
    {
       char *prova();
    
       char *chiama = "gesù";
       char *rispondi;
    
       printf("la stringa chiama è : %s\n",chiama);
       rispondi = prova();
       printf("la stringa rispondi, elaborata da una funzione è : %s\n",rispondi);
    
       return 0;
    }
    
    char *prova()
    {
       char *ris= "caxxo";
       char *altro;
    
       altro = "vrgsdjv";
       ris = altro;
       printf("la stringa ris, nella funzione è : %s\n",ris);
       return ris;
    }
    
    
  • Re: Restituire stringa da funzione

    L'esempio che hai fatto utilizza

    "stringhe costanti"

    che sono allocate nel testo dell'eseguibile non nello stack.

    Hai parecchi dubbi su questi argomenti, ti consiglio di rivederli tutti sul libro ...

    Quello che ti ho consigliato di fare è allocare la stringa (non costante) nell'heap all'interno della funzione e restituire il puntatore al chiamante.
  • Re: Restituire stringa da funzione

    Cioè devo allocare lo spazio per ris, assegnare ris a passcrypt e poi restituirla?
  • Re: Restituire stringa da funzione

    Devi allocare lo spazio per la stringa che sarà il risultato e restituire il puntatore ottenuto dalla malloc.

    Non ho fatto attenzione al metodo che utilizzi per "cifrare" e non ho ben chiaro il motivo per cui utilizzi un altro vettore temp invece di utilizzare direttamente ris ...

    Prova a modificare il codice e vediamo.
  • Re: Restituire stringa da funzione

    E non è quello che avevo fatto?
    ti prego di essere più chiaro non sto capendo!
  • Re: Restituire stringa da funzione

    Il metodo di "cifratura " è banale e consiste nell'invertire la stringa e traslarla di 1, giusto per divertirmi,,,però funziona
    e uso ris oltre a temp giusto per chiarezza del codice
    ho modificato il mio programma usando memcpy , e ora va, però spiegami meglio quello che intendevi suggerirmi tu perchè ho l'impressione che la mia soluzione non sia molto elegante
    
    void registrati(FILE *maindb)
    {
       giocatore nuovo;
       char pass[passlenght];
    
       char *crypt(char []);
    
       printf("Quale è il tuo numero nell\'elenco della classe?");
       scanf("%d",&nuovo.id);
       printf("inserisci il tuo username : ");
       scanf("\n%[^\n]",nuovo.nome);
       printf("Inserisci una password :");
       scanf("\n%[^\n]",pass);
       nuovo.password= crypt(pass);
       printf("%s\n",nuovo.password);
       nuovo.credito = startmoney;
       fseek(maindb,(nuovo.id - 1)*sizeof(giocatore),SEEK_SET);
       fwrite(&nuovo,sizeof(giocatore),1,maindb);
       printf("***Benvenuto nel sistema, \"%s\"\n"
              "hai un credito iniziale di %.1f***\n",nuovo.nome,nuovo.credito);
    }
    
    char *crypt(char pass[passlenght])
    {
       int i,j;
       char temp[passlenght];
       char *ris,*passcrypt;
    
       for(i = (strlen(pass)),j=0 ;i >= 0 ; i--,j++)
       {
          temp[j] = pass[i-1];
          temp[j]++;
       }
       temp[strlen(pass)] = '\0';
       ris = temp;
       passcrypt=malloc(sizeof(ris));
       memcpy(passcrypt, ris, sizeof(ris));
       printf("%s\n",passcrypt);
       return passcrypt;
    }
    
    
  • Re: Restituire stringa da funzione

    Passcrypt = malloc(sizeof(char *));

    in quella riga non ti sembra che ci sia qualcosa di sbagliato? tu allochi un puntatore a char 4 byte per contenere una stringa di molti più byte.

    una stringa è un vettore di char di un byte per carattere!

    passcrypt=malloc(sizeof(ris));

    alloca lo stesso quantitativo di spazio del comando scritto sopra.
    RIS è un char* e quindi continui ad allocare 4 byte.

    il codice postato con la memcpy va, va in buffer overflow.
  • Re: Restituire stringa da funzione

    Non so che dirti, ma ora il programma funziona correttamente
    per come ho inteso io l'argomento un puntatore contiene soltanto la locazione dell'area di memoria in cui è contenuto il valore, e quindi questa risoluzione è corretta.....cioè passcrypt è allocato a 4 byte di memoria che contengono l'indirizzo della stringa....dunque non conta la lunghezza della stringa se si usa un puntatore
  • Re: Restituire stringa da funzione

    Piranha ha scritto:


    non so che dirti, ma ora il programma funziona correttamente
    In C "funzionare" ed "essere corretto" non sono la stessa cosa.

    questa risoluzione è corretta.....
    Neanche per sogno. Forse non hai provato con password più grandi di 4 caratteri ...
    dunque non conta la lunghezza della stringa se si usa un puntatore
    Hai un concetto sballato di uso dei puntatori e te l'ho detto. Ti avevo detto di fare una certa cosa ma non l'hai fatta. Ti ha dato un suggerimento anche vbextreme ma hai ritenuto che non fosse da seguire. Non so cosa dirti ...

    Ti propongo il codice che ti suggerivo di scrivere, che è quello corretto
    
    char *crypt(char pass[])
    {
    	char *ris = NULL;
    	int slen = strlen(pass);
    	int i, j;
    
    	if(slen)
    	{
    		ris=(char *)malloc(slen+1);
    
    		for(i=slen, j=0; i>0; i--, j++)
    			ris[j] = pass[i-1]+1;
    
    		ris[slen] = '\0';
    	}
    
    	return ris;
    }
    
    forse capirai dove sbagli.
  • Re: Restituire stringa da funzione

    Veramente ho seguito il tuo consiglio, ma si vede che il Deitel non è chiaro su questi argomenti!
    così come ho cercato di seguire i vostri consigli, anche se in alcuni casi molto criptici

    allora risolto,grazie mille !
    quindi dopo devo usare la free nella funzione chiamante ,giusto?dopo aver scritto i dati su file
Devi accedere o registrarti per scrivere nel forum
15 risposte