Differenze tra le versioni di "Strncpy ()"
(3 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
− | La funzione | + | La funzione '''strncpy()''', dichiarata nel file header di sistema "''/usr/include/string.h''" |
char *strncpy (char *__restrict __dest, const char *__restrict __src, size_t __n) | char *strncpy (char *__restrict __dest, const char *__restrict __src, size_t __n) | ||
copia un numero ''__n'' di byte (cominciando comunque dal primo byte) dell'area di memoria puntata dal puntatore ''__src'' nell'area di memoria puntata dal Puntatore ''__dest''. | copia un numero ''__n'' di byte (cominciando comunque dal primo byte) dell'area di memoria puntata dal puntatore ''__src'' nell'area di memoria puntata dal Puntatore ''__dest''. | ||
− | Se la funzione | + | Se la funzione "strncpy()" incontra in ''__src'' un carattere nullo (0x00, ossia in Gambas: &h00), la funzione aggiungerà a ''_dest'' un numero di caratteri nulli fino a che ''n'' caratteri non sono stati scritti. |
− | La funzione | + | La funzione "strncpy()" può risultare non molto utile per la copia di una stringa in un'altra stringa, se l'area di memoria puntata dal Puntatore ''__src'' è più breve di n caratteri, la stringa di destinazione verrà troncata. |
Volendola utilizzare in Gambas, bisognerà dichiararla con ''Extern'', nonché bisognerà dichiarare la libreria di C: ''libc.so.6'', nella quale la funzione è contenuta: | Volendola utilizzare in Gambas, bisognerà dichiararla con ''Extern'', nonché bisognerà dichiarare la libreria di C: ''libc.so.6'', nella quale la funzione è contenuta: | ||
Private <FONT color=#B22222>Extern strncpy</font>(__dest As Pointer, __src As Pointer, __n As Long) In "<FONT color=#B22222>libc:6</font>" | Private <FONT color=#B22222>Extern strncpy</font>(__dest As Pointer, __src As Pointer, __n As Long) In "<FONT color=#B22222>libc:6</font>" | ||
− | |||
− | |||
Mostriamo un semplice esempio: | Mostriamo un semplice esempio: | ||
Private QUANTUM As Integer = 4 | Private QUANTUM As Integer = 4 | ||
Riga 23: | Riga 21: | ||
− | + | Public Sub Main() | |
− | + | Dim s As String | |
+ | Dim p1, p2 As Pointer | ||
− | p1 = | + | s = "abcde fghil" |
+ | |||
+ | p1 = VarPtr(s) | ||
p2 = Alloc(QUANTUM) | p2 = Alloc(QUANTUM) | ||
− | <FONT Color=gray>' ''Copia nell'area di memoria, puntata dal Puntatore del 1° argomento, i soli primi 4 byte dell'area di memoria puntata dal Puntatore del 2° argomento | + | <FONT Color=gray>' ''Copia nell'area di memoria, puntata dal Puntatore del 1° argomento, i soli primi 4 byte dell'area di memoria puntata dal Puntatore del 2° argomento:''</font> |
<FONT Color=#B22222>strncpy</font>(p2, p1, QUANTUM) | <FONT Color=#B22222>strncpy</font>(p2, p1, QUANTUM) | ||
− | + | ||
+ | <FONT Color=gray>' ''Per leggere la stringa, presente nell'area di memoria puntata dal Puntatore del 1° parametro, dereferenziamo tale Puntatore:''</font> | ||
Print String@(p2) | Print String@(p2) | ||
− | + | ||
+ | <FONT Color=gray>' ''Libera la porzione di memoria precedentemente allocata, e si assicura che il Puntatore non punti ad alcun indirizzo rilevante di memoria:''</font> | ||
Free(p2) | Free(p2) | ||
− | + | p2 = 0 | |
− | + | ||
− | + | End | |
− | |||
Versione attuale delle 15:02, 16 giu 2024
La funzione strncpy(), dichiarata nel file header di sistema "/usr/include/string.h"
char *strncpy (char *__restrict __dest, const char *__restrict __src, size_t __n)
copia un numero __n di byte (cominciando comunque dal primo byte) dell'area di memoria puntata dal puntatore __src nell'area di memoria puntata dal Puntatore __dest.
Se la funzione "strncpy()" incontra in __src un carattere nullo (0x00, ossia in Gambas: &h00), la funzione aggiungerà a _dest un numero di caratteri nulli fino a che n caratteri non sono stati scritti.
La funzione "strncpy()" può risultare non molto utile per la copia di una stringa in un'altra stringa, se l'area di memoria puntata dal Puntatore __src è più breve di n caratteri, la stringa di destinazione verrà troncata.
Volendola utilizzare in Gambas, bisognerà dichiararla con Extern, nonché bisognerà dichiarare la libreria di C: libc.so.6, nella quale la funzione è contenuta:
Private Extern strncpy(__dest As Pointer, __src As Pointer, __n As Long) In "libc:6"
Mostriamo un semplice esempio:
Private QUANTUM As Integer = 4 Library "libc:6" ' char *strncpy (char *__restrict __dest, const char *__restrict __src, size_t __n) ' Copy no more than N characters of SRC to DEST. Private Extern strncpy(__dest As Pointer, __src As Pointer, __n As Long) Public Sub Main() Dim s As String Dim p1, p2 As Pointer s = "abcde fghil" p1 = VarPtr(s) p2 = Alloc(QUANTUM) ' Copia nell'area di memoria, puntata dal Puntatore del 1° argomento, i soli primi 4 byte dell'area di memoria puntata dal Puntatore del 2° argomento: strncpy(p2, p1, QUANTUM) ' Per leggere la stringa, presente nell'area di memoria puntata dal Puntatore del 1° parametro, dereferenziamo tale Puntatore: Print String@(p2) ' Libera la porzione di memoria precedentemente allocata, e si assicura che il Puntatore non punti ad alcun indirizzo rilevante di memoria: Free(p2) p2 = 0 End
Riferimenti
- http://linux.die.net/man/3/strncpy
- https://www.gnu.org/software/libc/manual/html_node/Truncating-Strings.html
- http://digilander.libero.it/uzappi/C/librerie/funzioni/strcpy.html
- http://stackoverflow.com/questions/1453876/why-does-strncpy-not-null-terminate
- http://www.techonthenet.com/c_language/standard_library_functions/string_h/strncpy.php