Sprintf ()

Da Gambas-it.org - Wikipedia.

La funzione

int sprintf (char *__restrict __s, const char *__restrict __format, ...)

scrive nel Puntatore "__s" gli argomenti passati formattati.

Questa funzione viene solitamente utilizzata in C per convertire agevolmente un valore di tipo numerico in una Stringa.


Volendo utilizzare tale funzione in Gambas, bisognerà dichiararla con Extern, nonché bisognerà dichiarare la libreria di C: libc.so.6, nella quale essa è contenuta:

Private Extern sprintf(__s As Pointer, __format As String, valore As ...) As Integer


Mostriamo un semplice esempio, nel quale viene convertito in stringa un valore di tipo Float.

Library "libc:6"

' int sprintf (char *__restrict __s, const char *__restrict __format, ...)
' Write formatted output to S.
Private Extern sprintf(__s As Pointer, __format As String, f As Float) As Integer


Public Sub Main()
 
 Dim p As Pointer
 Dim s As String
 
' Allochiamo un'area di memoria adeguata a contenere la stringa finale:
  p = Alloc(SizeOf(gb.Byte), 12)
 
  sprintf(p, "%f", 123.456789)
   
  s = String@(p)
  
  Print s
   
' Liberiamo la memoria precedentemente allocata:
  Free(p)
  
End


Mostriamo un altro semplice esempio, nel quale viene convertito in stringa un valore di tipo Intero.

Library "libc:6"

' int sprintf (char *__restrict __s, const char *__restrict __format, ...)
' Write formatted output to S.
Private Extern sprintf(__s As Pointer, __format As String, i As Integer) As Integer


Public Sub Main()
 
 Dim p As Pointer
 Dim s As String
 
' Allochiamo un'area di memoria adeguata a contenere la stringa finale:
  p = Alloc(SizeOf(gb.Integer), 4)
 
  sprintf(p, "%d", 123456789)
   
  s = String@(p)
  
  Print s
   
' Liberiamo la memoria precedentemente allocata:
  Free(p)
  
End


In quest'altro più breve esempio viene utilizzata una variabile vettoriale di tipo Byte[ ]:

Library "libc:6"

' int sprintf (char *__restrict __s, const char *__restrict __format, ...)
' Write formatted output to S.
Private Extern sprintf(__s As Byte[], __format As String, f As Float) As Integer


Public Sub Main()
 
 Dim bb As New Byte[32]
 Dim s As String
 
  sprintf(bb, "%f", 12345.6789)
      
' Optiamo per la dereferenziazione del Puntatore ai dati dell'array,
' poiché in tal modo non saranno stampati anche gli eventuali byte aventi valore &h00,
' dati dalla dimensione del vettore eventualmente superiore alla quantità di caratteri:
  s = String@(bb.Data)
  
  Print s
       
End


In questo esempio si utilizzerà la funzione esterna sprintf( ) con la funzione esterna malloc( ) per convertire un valore numerico in una stringa di corrispondenti caratteri ASCII. Il risultato sarà poi mostrato con la funzione esterna printf( ).

Library "libc:6"

' void *malloc (size_t __size)
' Allocate SIZE bytes of memory.
Private Extern malloc(__size As Long) As Pointer

' int sprintf (char *__restrict __s, const char *__restrict __format, ...)
' Write formatted output to S.
Private Extern sprintf(__s As Pointer, __format As String, i As Integer) As Integer

' int printf (const char *__restrict __format, ...)
' Write formatted output to stdout.
Private Extern printf(__format As String, __s As Pointer) As Integer

' void free (void *__ptr)
' Free a block allocated by `malloc', `realloc' or `calloc'.
Private Extern free_C(__ptr As Pointer) Exec "free"


Public Sub Main()

 Dim c As Pointer
 
' Viene allocata mediante la funzione esterna "malloc()" un'area di memoria pari a 16 byte:
  c = malloc(SizeOf(gb.Byte) * 16)
  If c = 0 Then Error.Raise("Impossibile allocare memoria !")
  
' Scriviamo con la funzione esterna "sprintf()" il valore numerico nel Puntatore come stringa di singoli caratteri numerici ASCII:
  sprintf(c, "%d", 12345678)
 
' Andiamo a vedere il risultato:
  printf("%s\n", c)
  
' Liberiamo la memoria complesivamente allocata:
  free_C(c)
  
' Facciamo in modo che per sicurezza il Puntatore punti all'indirizzo zero::
  c = 0
  
End


Qui invece si utilizzerà la funzione esterna sprintf( ) con le funzioni esterne malloc( ) e realloc( ) per unire due stringhe di caratteri:

Library "libc:6"

' void *malloc (size_t __size)
' Allocate SIZE bytes of memory.
Private Extern malloc(__size As Long) As Pointer

' void *realloc (void *__ptr, size_t __size)
' Re-allocate the previously allocated block in PTR, making the new block SIZE bytes long.
Private Extern realloc_C(__ptr As Pointer, __size As Long) As Pointer Exec "realloc"

' int sprintf (char *__restrict __s, const char *__restrict __format, ...)
' Write formatted output to S.
Private Extern sprintf(__s As Pointer, __format As String, s As String) As Integer

' void free (void *__ptr)
' Free a block allocated by `malloc', `realloc' or `calloc'.
Private Extern free_C(__ptr As Pointer) Exec "free"


Public Sub Main()

 Dim p1, p2 As Pointer
 Dim s1, s2 As String
 Dim st As Stream
 
  s1 = "abcd"
  s2 = "efg"

' Viene allocata mediante la funzione esterna "malloc()" un'area di memoria pari a 5 byte (4 per i caratteri alfabetici + 1 per il valore &h00 di fine stringa):
  p1 = malloc(SizeOf(gb.Byte) * 5)
  If p1 = 0 Then Error.Raise("Impossibile allocare memoria !")
  
' Nell'area di memoria allocata vengono scritti i caratteri contenuti nella variabile stringa "s1":
  st = Memory p1 For Write
  Write #st, s1
  st.Close
  Print String@(p1)
  
' Utilizziamo, dunque, la funzione esterna "realloc()" per ridefinire la quantità di memoria riservata:
  p2 = realloc_C(p1, SizeOf(gb.Byte) * 8)
  If p2 = 0 Then Error.Raise("Impossibile riallocare la memoria già allocata !")
  
' Scriviamo questa volta con la funzione esterna "sprintf()" altri valori.
' In particolare, ai valori già scritti, vengono aggiunti quelli della variabile stringa "s2":
  sprintf(p2 + 4, "%s", s2)
 
' Andiamo a vedere i valori memorizzati nella memoria allocata, sia i precedenti che quelli or ora aggiunti:
  Print String@(p2)
  
' Liberiamo la memoria complesivamente allocata:
  free_C(p2)
  
' Facciamo in modo che per sicurezza il Puntatore punti all'indirizzo zero::
  p2 = 0
  
End



Riferimenti