Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 17 su 17

Discussione: [C] porting e gestione carattere \0

  1. #11
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,336
    Scorri l'array locazione per locazione e cerchi il NULL.
    Tuttavia occorre sapere il contesto di chiamata dato che non basta la presenza di un NULL per rendere un array di char una stringa.
    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.

  2. #12
    e facendo una printf sull'ultima posizione dell'array? è sbagliato?
    conoscendo la grandezza dello stesso ovviamente

    grazie

  3. #13
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,336
    Se già conosci la lunghezza dell'array a che ti serve sapere se termina con NULL?
    Insomma, stai girando intorno al tuo dubbio, cercando certezze quando non ce ne sono. Giusto per chiarezza, posso avere un array di char di 4096 elementi intelleggibili, con NULL un po' ovunque, e considerare quell'array come una stringa o array di char a seconda di cosa mi conviene fare.
    Finchè non mostri codice concreto di cosa ti crea dubbi non si può andare molto avanti.
    Il codice che hai mostrato all'inizio:
    codice:
    char string2[1];
    string2[0] = 'a';
    printf("\n%s\n", string2);
    è sbagliato perché la printf() con il %s si aspetta un NULL alla fine di quell'array, ma tu hai solo un carattere.
    Tutte le funzioni di <string.h> (strcpy(), strlen() etc...) si aspettano alla fine dell'array un NULL, così come la puts() e la printf().
    Se manca il NULL finale, non puoi usare quelle funzioni, ma devi agire in modo diverso.
    E come ho detto prima, anche se un array di char ha un NULL finale non significa in automatico che sia una stringa: dipende dal contesto di chiamata. Contesto che continui a non mostrare (per caso stai facendo il porting di un progetto della NSA?)
    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.

  4. #14
    \\\\

  5. #15
    ci provo

    ho la valorizzazione di alcune variabili in questa maniera

    strncpy((char *)miavariabile.arr,(const char *)ptr->MTOT,(size_t) sizeof(ptr->MTOT));

    a volte segue del codice del genere

    miavariabile.arr[sizeof(ptr->MTOT)] = '\0';

    non sempre però

    queste variabili sono poi scritte nel DB con una insert e nei log trovo

    ORA-01480 (trailing null missing from STR bind value)


    cercando, leggo che

    "In Pro*C and ORA-01480 may be caused by a lack of the trailing NULL character"


    ho collegato le cose e ho pensato che la mancanza del '\0' possa essere la causa

    questo su Linux dopo il porting; HPUX sembra aggiungere in automatico il '\0' e quindi lì il problema non si verifica

    grazie

  6. #16
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,336
    Studiati bene la strncpy:
    http://en.cppreference.com/w/c/string/byte/strncpy
    If count is reached before the entire array src was copied, the resulting character array is not null-terminated.
    Vari esempi sono appena più sotto.

    Posso azzardare che in alcuni casi ptr->MTOT abbia al suo interno almeno un carattere NULL, mentre in altri casi no.
    Nel primo caso il carattere NULL viene copiato all'interno di miavariabile.arr mentre nel secondo caso, ossia quando viene raggiunta la dimensione massima di caratteri copiabili definita come sizeof(ptr->MTOT), no. In quest'ultimo caso è necessario terminare manualmente miavariabile.arr aggiungendo il NULL finale.
    Per evitare casi borderline come questo ti consiglio di effettuare una memset() su miavariabile.arr in questo modo:
    codice:
    memset(miavariabile.arr,0, numero_di_elementi);
    dove numero_di_elementi è la lunghezza di miavariabile.arr, subito prima di quelle strncpy(). In questo modo sei sicuro che dopo la copia di ptr->MTOT in miavariabile.arr, quest'ultima sia sempre NULL terminated.
    Occhio però che se miavariabile.arr, non è un array ma un puntatore allocato, una sizeof() ti darà la dimensione del puntatore, non quanti elementi sono allocati.
    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.

  7. #17
    grazie (ora approfondisco e metto dei log, poi magari ti scasso di nuovo :-))

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 © 2017 vBulletin Solutions, Inc. All rights reserved.