Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214

    [C] Problema strncpy: output incomprensibile!

    Ciao a tutti, torno a scrivervi per un problema che ho avuto in fase di compilazione. Devo copiare degli array di char in un'unica stringa, questo è il codice che ho usato anche in altre funzioni, e che non mi genera errori:

    codice:
     
    typedef struct autore {
      /** cognome/i (almeno uno deve essere presente) */
      char cognome[LCOGN +1];
      /** nome/i (almeno uno deve essere presente) */ 
      char nome [LNOME + 1];
      /** puntatore al prossimo autore */ 
      struct autore * next; 
    } autore_t;
    
    typedef struct scheda {
      /** puntatore lista degli autori */
      autore_t* autore;         
      /** titolo */
      char titolo[LLSTRING +1];   
    } scheda_t;
    
    //FRAMMENTO DI FUNZIONE INCRIMINATA
    //devo restituire un puntatore alla stringa
    char* stampa_recor(scheda_t* s){
      char* strnome, strcognome;             
          strnome=strncpy(strnome, s->autore->nome, sizeof(strnome-1)); 		    
               strnome[sizeof(strnome)-1]= '\0';
          strcognome=strncpy(strcognome, s->autore->cognome, sizeof(strcognome-1));
                strnome[sizeof(strnome)-1]= '\0';
    }
    Ora vi posto l'output del compilatore:

    codice:
    :25:11: warning: passing argument 1 of ‘strncpy’ makes pointer from integer without a cast [enabled by default] /usr/include/string.h :131 :14: note: expected ‘char * restrict’ but argument is of type ‘char’ scheda_to_record.c:25:21: warning: assignment makes integer from pointer without a cast [enabled by default]
    La cosa che mi lascia perplesso è, che le due chiamate alla strncpy sono identiche, e gli elementi che gli passo sono elmenti della stessa struttura, solo che, il primo non genera nessun errore, il secondo si!
    Lo stesso identico procedimento lo uso anche in un'altra funzione, anche li nessun errore! Che c'è di sbagliato secondo voi? Io non riesco proprio a capirlo questo errore! Confido in voi, grazie in anticipo!

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    E sono entrambe sbagliate.
    Il primo errore è qui (quello che genera il warning).
    codice:
    char* strnome, strcognome;
    Solo strnome è un char pointer, l'altro è solo un char.
    Perché entrambi siano puntatori devi scrivere:
    codice:
    char *strnome, *strcognome;
    Il secondo errore è che per quei puntatori non allochi spazio, quindil il massimo che ottieni è un bel crash. Alloca memoria sufficiente.

    Il terzo errore è quel sizeof(strnome) che al massimo restituisce 4 (la dimensione di un puntatore su piattoforme 32bit).
    Quel parametro semmai deve valere: strlen(s->autore->nome).

    Qui per altri dettagli:
    http://www.cplusplus.com/reference/c...tring/strncpy/
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Ti ringrazio per la risposta, correggerò questi errori.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.