Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119

    [C] Sprintf e allocazione dinamica

    Volendo creare una stringa che contenga, ad esempio 3 interi scritti in sequenza secondo la notazione decimale (Secondo questo formato quindi: "%d%d%d") come occorre allocare (Dinamicamene) il buffer per la stringa da creare ?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Intanto la stringa di formattazione e' bene che sia "%d %d %d" in modo da separare i 3 valori almeno con uno spazio.

    Per l'allocazione, devi prevedere il numero massimo di caratteri. Ad esempio, se gli interi sono dei valori a 32 bit con segno, questi potranno essere lunghi al massimo 10 caratteri (segno piu' 9 cifre) e quindi, considerando gli spazi e il terminatore, dovrai allocare *almeno* 33 caratteri.

    Quindi, userai la malloc ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119
    Mi sa che ne sono necessari 10 anche se non si considera il segno, o sbaglio ?

    2^32 = 4.294.967.296

    9^10 = 3.486.784.401

  4. #4

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Puoi anche scrivere una piccola funzione che conti le cifre di ciascun numero prima di fare l'allocazione della memoria. Ti basta eseguire queste righe

    codice:
        /* per il segno (se c'è) e per il caso in cui il numero sia proprio 0 */
        if ( num < 0 || num == 0 )
           cnt++;
    
        while ( num ) {
              num /= 10;
              cnt++;
        }
    per tutti e tre i numeri e alla fine cnt conterrà il numero di cifre totali. A quel punto ti basta magari incrementarlo di 3 (per due spazi e il terminatore) e procedi con l'allocazione dinamica della memoria senza sprecare spazio. Certo in questo modo esegui calcoli in più, quindi non è detto che sia la soluzione migliore... è solo per la cronaca
    every day above ground is a good one

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da YuYevon
    Puoi anche scrivere una piccola funzione ...
    E' piu' pratico l'uso di un logaritmo ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Ed_Bunker
    Mi sa che ne sono necessari 10 anche se non si considera il segno, o sbaglio ?

    2^32 = 4.294.967.296

    9^10 = 3.486.784.401
    Sì ... sono 11 per ogni intero + 3 per separatori e terminatore ... almeno 36 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119
    Originariamente inviato da oregon
    Sì ... sono 11 per ogni intero + 3 per separatori e terminatore ... almeno 36 ...
    Considerando unsigned int dovrebbero essere necessarie (E sufficienti) proprio 10 cifre per ciascun intero.

    Non credo, inoltre, che vi sia la necessita' di inserire uno spazio tra i diversi unsigned int che formeranno la stringa.
    Il carattere finale '\0' viene inserito dalla sprintf "automaticamente" oppure deve essere inserito esplicitamente ?

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Se sono "unsigned" ovviamente non consideri il segno (ma tu avevi parlato di 3 interi senza dire nulla sui segni) ... il terminatore lo scrive la sprintf ma lo spazio lo devi prevedere tu.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119
    Originariamente inviato da oregon ... il terminatore lo scrive la sprintf ma lo spazio lo devi prevedere tu.
    Si, certo, questo si.
    Quello che mi chiedevo e'... se non allocando lo spazio per il carettere finale aggiuntivo si provoca (possibilmente) un seg fault in seguito alla chiamata alla sprintf o se, invece, in tal caso la sprintf sovrascrive il carattere finale oppure proprio non mette lo '\0' con conseguenze problematiche quando si andra' a fare la free...

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