El lenguaje de programación C cuenta con un conjunto de funciones que implementan operaciones con cadenas (de caracteres y de bytes) en su biblioteca estándar . Se admiten diversas operaciones, como copiar, concatenar , tokenizar y buscar. Para las cadenas de caracteres, la biblioteca estándar utiliza la convención de que las cadenas terminan en nulo : una cadena de n caracteres se representa como una matriz de n + 1 elementos, el último de los cuales es un carácter nulo con valor numérico 0.
El único soporte para cadenas en el lenguaje de programación propiamente dicho consiste en que el compilador traduce las constantes de cadena entre comillas a cadenas terminadas en nulo.
Definiciones
Una cadena se define como una secuencia contigua de unidades de código terminada por la primera unidad de código cero (a menudo llamada unidad de código NUL ). [ 1 ] Esto significa que una cadena no puede contener la unidad de código cero, ya que la primera que se encuentra marca el final de la cadena. La longitud de una cadena es el número de unidades de código antes de la unidad de código cero. [ 1 ] La memoria ocupada por una cadena siempre es una unidad de código más que su longitud, ya que se necesita espacio para almacenar el terminador cero.
Generalmente, el término cadena se refiere a una cadena cuya unidad de código es de tipo char, que equivale exactamente a 8 bits en todas las máquinas modernas. C90 define cadenas anchas [ 1 ] que utilizan una unidad de código de tipo wchar_t, que equivale a 16 o 32 bits en las máquinas modernas. Esto se concibió para Unicode , pero cada vez es más común utilizar UTF-8 en cadenas normales para Unicode.
Las cadenas se pasan a las funciones mediante un puntero a la primera unidad de código. Dado que char*y wchar_t*son de tipos diferentes, las funciones que procesan cadenas anchas son distintas de las que procesan cadenas normales y tienen nombres diferentes.
Los literales de cadena ( "text"en el código fuente C) se convierten en arreglos ( char[]en C o const char[]en C++) durante la compilación. [ 2 ] El resultado es un arreglo de unidades de código que contiene todos los caracteres más una unidad de código cero final. En C90 L"text"se produce una cadena ancha. Un literal de cadena puede contener la unidad de código cero (una forma es insertarla \0en el código fuente), pero esto hará que la cadena termine en ese punto. El resto del literal se colocará en memoria (con otra unidad de código cero añadida al final), pero es imposible saber que esas unidades de código se tradujeron desde el literal de cadena; por lo tanto, dicho código fuente no es un literal de cadena. [ 3 ]
Codificaciones de caracteres
Cada cadena termina en la primera aparición de la unidad de código cero del tipo apropiado ( charo wchar_t). En consecuencia, una cadena de bytes ( char*) puede contener caracteres que no sean NUL en ASCII o cualquier extensión ASCII , pero no caracteres en codificaciones como UTF-16 (aunque una unidad de código de 16 bits podría ser distinta de cero, su byte alto o bajo podría ser cero). Las codificaciones que se pueden almacenar en cadenas anchas están definidas por el ancho de wchar_t. En la mayoría de las implementaciones, wchar_tes de al menos 16 bits, por lo que todas las codificaciones de 16 bits, como UCS-2 , se pueden almacenar. Si wchar_tes de 32 bits, entonces se pueden almacenar codificaciones de 32 bits, como UTF-32 . (El estándar requiere un "tipo que contenga cualquier carácter ancho", lo cual en Windows ya no es cierto desde el cambio de UCS-2 a UTF-16. Esto se reconoció como un defecto en el estándar y se corrigió en C++.) [ 4 ] C++11 y C11 agregan dos tipos con anchos explícitos char16_ty char32_t. [ 5 ]
Las codificaciones de ancho variable se pueden usar tanto en cadenas de bytes como en cadenas anchas. La longitud de la cadena y los desplazamientos se miden en bytes o wchar_t, no en "caracteres", lo que puede resultar confuso para los programadores principiantes. UTF-8 y Shift JIS se usan a menudo en cadenas de bytes de C, mientras que UTF-16 se usa a menudo en cadenas anchas de C cuando wchar_tes de 16 bits. Truncar cadenas con caracteres de ancho variable usando funciones como strncpypuede producir secuencias no válidas al final de la cadena. Esto puede ser inseguro si las partes truncadas son interpretadas por código que asume que la entrada es válida.
El soporte para literales Unicode como (UTF-8) o (UTF-16 o UTF-32, depende de ) está definido por la implementación, [ 6 ] y puede requerir que el código fuente esté en la misma codificación, especialmente para donde los compiladores podrían simplemente copiar lo que esté entre las comillas. Algunos compiladores o editores requerirán ingresar todos los caracteres no ASCII como secuencias para cada byte de UTF-8, y/o para cada palabra de UTF-16. Desde C11 (y C++11), está disponible un nuevo prefijo literal que garantiza UTF-8 para un literal de cadena de bytes, como en . [ 7 ] Desde C++20 y C23 , se agregó un tipo que está destinado a almacenar caracteres UTF-8 y los tipos de literales de caracteres y cadenas con prefijo u8 se cambiaron a y respectivamente.charfoo[512]="φωωβαρ";wchar_tfoo[512]=L"φωωβαρ";wchar_tchar\xNN\uNNNNu8charfoo[512]=u8"φωωβαρ";char8_tchar8_tchar8_t[]
Características
Terminología
En la documentación histórica, el término "carácter" se usaba a menudo en lugar de "byte" para las cadenas de C, lo que lleva a muchos a creer que estas funciones no funcionan con UTF-8 . De hecho, todas las longitudes se definen en bytes, y esto es cierto en todas las implementaciones; además, estas funciones funcionan igual de bien con UTF-8 que con codificaciones de un solo byte. La documentación de BSD se ha corregido para aclarar este punto, pero la documentación de POSIX, Linux y Windows sigue usando "carácter" en muchos lugares donde "byte" o "wchar_t" es el término correcto.
Las funciones para manejar búferes de memoria pueden procesar secuencias de bytes que incluyen bytes nulos como parte de los datos. Los nombres de estas funciones normalmente comienzan con mem, en contraposición al strprefijo.
Encabezados
La mayoría de las funciones que operan con cadenas de caracteres de C se declaran en el string.harchivo de cabecera ( cstringen C++), mientras que las funciones que operan con cadenas de caracteres anchas de C se declaran en el wchar.harchivo de cabecera ( cwcharen C++). Estos archivos de cabecera también contienen declaraciones de funciones utilizadas para gestionar búferes de memoria; por lo tanto, el nombre resulta algo engañoso.
Las funciones declaradas en string.hson extremadamente populares ya que, como parte de la biblioteca estándar de C , se garantiza su funcionamiento en cualquier plataforma que admita C. Sin embargo, existen algunos problemas de seguridad con estas funciones, como posibles desbordamientos de búfer si no se usan con cuidado y correctamente, lo que lleva a los programadores a preferir variantes más seguras y posiblemente menos portátiles, de las cuales algunas populares se enumeran a continuación. Algunas de estas funciones también violan la corrección de const al aceptar un constpuntero de cadena y devolver un constpuntero que no es un const dentro de la cadena. Para corregir esto, algunas se han separado en dos funciones sobrecargadas en la versión de C++ de la biblioteca estándar.
Constantes y tipos
Funciones
Funciones multibyte
Todas estas funciones necesitan unambstate_tobjeto, originalmente en memoria estática (lo que hace que las funciones no sean seguras para subprocesos) y en adiciones posteriores el llamador debe mantener. Esto originalmente estaba destinado a rastrear estados de cambio en elmegabytecodificaciones, pero las modernas como UTF-8 no necesitan esto. Sin embargo, estas funciones fueron diseñadas bajo el supuesto de que laWCLa codificación no es una codificación de ancho variable y, por lo tanto, está diseñada para manejar exactamente unawchar_ta la vez, pasándolo por valor en lugar de usar un puntero de cadena. Como UTF-16 es una codificación de ancho variable,mbstate_tse ha reutilizado para realizar un seguimiento de los pares sustitutos en la codificación amplia, aunque el llamador aún debe detectar y llamarmbtowcdos veces para un solo carácter. [ 80 ] [ 81 ] [ 82 ] Las adiciones posteriores al estándar admiten que la única conversión que interesa a los programadores es entre UTF-8 y UTF-16 y la proporcionan directamente.
Conversiones numéricas
La biblioteca estándar de C contiene varias funciones para conversiones numéricas. Las funciones que manejan cadenas de bytes están definidas en el stdlib.hencabezado ( cstdlibencabezado en C++). Las funciones que manejan cadenas anchas están definidas en el wchar.hencabezado ( cwcharencabezado en C++).
Las funciones strchr, bsearch, strpbrk, strrchr, strstr, memchry sus contrapartes anchas no son const-correctas , ya que aceptan un constpuntero a cadena y devuelven un constpuntero que no es un puntero dentro de la cadena. Esto se ha corregido en C23 . [ 95 ]
Además, desde la Enmienda Normativa 1 (C95), atoxxlas funciones se consideran subsumidas por strtoxxxlas funciones, razón por la cual ni C95 ni ninguna norma posterior proporciona versiones de caracteres anchos de estas funciones. El argumento en contra atoxxes que no diferencian entre un error y un 0. [ 96 ]
Extensiones populares
Varios estándares relacionados han ampliado la funcionalidad de manejo de cadenas proporcionada por el estándar C, incluidos BSD , SVID y POSIX . Algunas de estas funciones se han añadido en estándares C más recientes (por ejemplo, C11 y C23 ).
strlcpy, strlcat
A pesar de la necesidad bien establecida de reemplazar strcat[ 22 ] y strcpy[ 18 ] con funciones que no permitan desbordamientos de búfer, no ha surgido ningún estándar aceptado. Esto se debe en parte a la creencia errónea de muchos programadores de C de que strncaty strncpytienen el comportamiento deseado; sin embargo, ninguna de las funciones fue diseñada para esto (fueron destinadas a manipular búferes de cadena de tamaño fijo con relleno nulo, un formato de datos menos común en el software moderno), y el comportamiento y los argumentos no son intuitivos y a menudo están escritos incorrectamente incluso por programadores expertos. [ 108 ]
Los reemplazos más populares [ a ] son las funciones strlcat[ 111 ] y strlcpy[ 112 ] , que aparecieron en OpenBSD 2.4 en diciembre de 1998. [ 108 ] Estas funciones siempre escriben un NUL en el búfer de destino, truncando el resultado si es necesario, y devuelven el tamaño del búfer que se necesitaría, lo que permite detectar el truncamiento y proporciona un tamaño para crear un nuevo búfer que no se truncará. Durante mucho tiempo no se han incluido en la biblioteca GNU C (utilizada por el software en Linux), basándose en que supuestamente son ineficientes, [ 113 ] fomentan el uso de cadenas C (en lugar de alguna forma alternativa superior de cadena), [ 114 ] [ 115 ] y ocultan otros posibles errores. [ 116 ] [ 117 ] Incluso cuando glibc no había agregado soporte, strlcat y strlcpy se han implementado en varias otras bibliotecas C, incluidas las de OpenBSD, FreeBSD , NetBSD , Solaris , OS X y QNX , así como en bibliotecas C alternativas para Linux, como libbsd , introducida en 2008, [ 118 ] y musl , introducida en 2011, [ 119 ] [ 120 ] y el código fuente agregado directamente a otros proyectos como SDL , GLib , ffmpeg , rsync , e incluso internamente en el kernel de Linux . Esto cambió en 2024, las FAQ de glibc señalan que a partir de glibc 2.38, el código se ha confirmado [ 121 ] y por lo tanto se ha agregado. [ 122 ] Estas funciones se estandarizaron como parte de POSIX.1-2024, [ 123 ] el Rastreador de defectos de Austin Group ID 986 registró algunas discusiones sobre tales planes para POSIX.
Como parte de su ciclo de vida de desarrollo seguro de 2004 , Microsoft introdujo una familia de funciones "seguras" que incluían strcpy_sy strcat_s(junto con muchas otras). [ 124 ] Estas funciones se estandarizaron con algunos cambios menores como parte de la C11 opcional (Anexo K) propuesta por ISO/IEC WDTR 24731. [ 125 ] Estas funciones realizan varias comprobaciones, incluida si la cadena es demasiado larga para caber en el búfer. Si las comprobaciones fallan, se llama a una función de "controlador de restricciones en tiempo de ejecución" especificada por el usuario, [ 126 ] que normalmente aborta el programa. [ 127 ] [ 128 ] Estas funciones atrajeron considerables críticas porque inicialmente se implementaron solo en Windows y, al mismo tiempo, Microsoft Visual C++ comenzó a producir mensajes de advertencia que sugerían el uso de estas funciones en lugar de las estándar. Algunos han especulado que esto fue un intento de Microsoft de obligar a los desarrolladores a usar su plataforma. [ 129 ] La experiencia con estas funciones ha mostrado problemas significativos con su adopción y errores en su uso, por lo que se propuso la eliminación del Anexo K para la próxima revisión del estándar C. [ 130 ] Se ha sugerido el uso de memset_scomo una forma de evitar optimizaciones no deseadas del compilador. [ 131 ] [ 132 ]
Véase también
- Sintaxis de C § Cadenas : sintaxis del código fuente, incluidas las secuencias de escape con barra invertida
- Manejo de cadenas en C++
- funciones de cadena
- Expresiones regulares compatibles con Perl (PCRE)
Notas
- ↑ En GitHub, hay 7.813.206 usos de
strlcpy, frente a 38.644 usos destrcpy_s(y 15.286.150 usos destrcpy).
Referencias
- 1 2 3 "El borrador estándar C99 + TC3" (PDF) . §7.1.1p1 . Consultado el 7 de enero de 2011 .
{{cite web}}: CS1 mantenimiento: ubicación ( enlace ) - ↑ "El borrador estándar C99 + TC3" (PDF) . §6.4.5p7 . Consultado el 7 de enero de 2011 .
{{cite web}}: CS1 mantenimiento: ubicación ( enlace ) - ↑ "El borrador estándar C99 + TC3" (PDF) . Sección 6.4.5 nota al pie 66. Consultado el 7 de enero de 2011 .
{{cite web}}: CS1 mantenimiento: ubicación ( enlace ) - ↑ "Relajar los requisitos de wchar_t para que coincidan con las prácticas existentes" (PDF) .
- ↑ "Tipos fundamentales" . en.cppreference.com .
- ↑ "El borrador de la norma C99 + TC3" (PDF) . §5.1.1.2 Fases de traducción , p1 . Consultado el 23 de diciembre de 2011 .
{{cite web}}: CS1 mantenimiento: ubicación ( enlace ) - ↑ "literales de cadena" . en.cppreference.com . Consultado el 23 de diciembre de 2019 .
- ↑ "stddef.h - definiciones de tipos estándar" . The Open Group . Consultado el 28 de enero de 2017 .
- ↑ Gillam, Richard (2003). Unicode Demystified: A Practical Programmer's Guide to the Encoding Standard . Addison-Wesley Professional. p. 714. ISBN 9780201700527.
- ↑ "c++ - ¿Cuál es el uso de wchar_t en la programación general?" . Stack Overflow . Consultado el 1 de agosto de 2022 .
- ↑ "char, wchar_t, char8_t, char16_t, char32_t" . docs.microsoft.com . Consultado el 1 de agosto de 2022 .
- ↑ "char8_t" .
- 1 2 " < cuchar > (uchar.h)" .
- ↑ "char16_t" .
- 1 2 "Reemplazar macros de texto" .
- 1 2 "Tipos fundamentales" .
- ↑ "char32_t" .
- 1 2 "strcpy - cppreference.com" . En.cppreference.com. 2 de enero de 2014. Consultado el 6 de marzo de 2014 .
- ↑ "wcscpy - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "strncpy - cppreference.com" . En.cppreference.com. 4 de octubre de 2013. Consultado el 6 de marzo de 2014 .
- ↑ "wcsncpy - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- 1 2 "strcat - cppreference.com" . En.cppreference.com. 8 de octubre de 2013 . Consultado el 6 de marzo de 2014 .
- ↑ "wcscat - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "strncat - cppreference.com" . En.cppreference.com. 1 de julio de 2013 . Consultado el 6 de marzo de 2014 .
- ↑ "wcsncat - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "strxfrm - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "wcsxfrm - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "strlen - cppreference.com" . En.cppreference.com. 27 de diciembre de 2013 . Consultado el 6 de marzo de 2014 .
- ↑ "wcslen - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "strcmp - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "wcscmp - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "strncmp - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "wcsncmp - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "strcoll - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "wcscoll - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "strchr - cppreference.com" . En.cppreference.com. 23 de febrero de 2014. Consultado el 6 de marzo de 2014 .
- ↑ "wcschr - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "strrchr - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "wcsrchr - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "strspn - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "wcsspn - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "strcspn - cppreference.com" . En.cppreference.com. 31 de mayo de 2013. Consultado el 6 de marzo de 2014 .
- ↑ "wcscspn - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "strpbrk - cppreference.com" . En.cppreference.com. 31 de mayo de 2013. Consultado el 6 de marzo de 2014 .
- ↑ "wcspbrk - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "strstr - cppreference.com" . En.cppreference.com. 16 de octubre de 2013. Consultado el 6 de marzo de 2014 .
- ↑ "wcsstr - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "strtok - cppreference.com" . En.cppreference.com. 3 de septiembre de 2013. Consultado el 6 de marzo de 2014 .
- ↑ "wcstok - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "strerror - cppreference.com" . En.cppreference.com. 31 de mayo de 2013. Consultado el 6 de marzo de 2014 .
- ↑ "memset - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "wmemset - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "memcpy - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "wmemcpy - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "memmove - cppreference.com" . En.cppreference.com. 25 de enero de 2014. Consultado el 6 de marzo de 2014 .
- ↑ "wmemmove - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "memcmp - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "wmemcmp - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "memchr - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "wmemchr - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "mblen - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "mbtowc - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "wctom - cppreference.com" . En.cppreference.com. 4 de febrero de 2014. Consultado el 6 de marzo de 2014 .
- ↑ "mbstowcs - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "wcstombs - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "btowc - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "wctob - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "mbsinit - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "mbrlen - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "mbrtowc - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "wcrtomb - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "mbsrtowcs - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "wcsrtombs - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ «mbrtoc8-cppreference.com» . En.cppreference.com.
- ↑ "c8rtomb - cppreference.com" . En.cppreference.com.
- ↑ "mbrtoc16 - cppreference.com" . En.cppreference.com.
- ↑ «c16rtomb-cppreference.com» . En.cppreference.com.
- ↑ "mbrtoc32 - cppreference.com" . En.cppreference.com.
- ↑ «c23rtomb-cppreference.com» . En.cppreference.com.
- ↑ "6.3.2 Representación del estado de la conversión" . La biblioteca GNU C. Consultado el 31 de enero de 2017 .
- ↑ "root/src/multibyte/c16rtomb.c" . Consultado el 31 de enero de 2017 .
- ↑ "Contenido de /stable/11/lib/libc/locale/c16rtomb.c" . Consultado el 31 de enero de 2017 .
- ↑ "atof - cppreference.com" . En.cppreference.com. 31 de mayo de 2013 . Consultado el 6 de marzo de 2014 .
- ↑ «atoi, atolón, atolón - cppreference.com» . En.cppreference.com. 18 de enero de 2014 . Consultado el 6 de marzo de 2014 .
- ↑ "strtof, strtod, strtold - cppreference.com" . En.cppreference.com. 4 de febrero de 2014. Consultado el 6 de marzo de 2014 .
- ↑ "strtof, strtod, strtold - cppreference.com" . En.cppreference.com. 4 de febrero de 2014. Consultado el 6 de marzo de 2014 .
- ↑ "strtof, strtod, strtold - cppreference.com" . En.cppreference.com. 4 de febrero de 2014. Consultado el 6 de marzo de 2014 .
- ↑ "wcstof, wcstod, wcstold - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "wcstof, wcstod, wcstold - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "wcstof, wcstod, wcstold - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "strtol, strtoll - cppreference.com" . En.cppreference.com. 4 de febrero de 2014. Consultado el 6 de marzo de 2014 .
- ↑ "wcstol, wcstoll - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "strtoul, strtoull - cppreference.com" . En.cppreference.com. 4 de febrero de 2014 . Consultado el 6 de marzo de 2014 .
- ↑ "wcstoul, wcstoull - cppreference.com" . En.cppreference.com . Consultado el 6 de marzo de 2014 .
- ↑ "WG14-N3020 : Funciones de biblioteca estándar que preservan calificadores, v4" (PDF) . open-std.org . 13 de junio de 2022.
- ↑ Fundamento C99, 7.20.1.1
- ↑ "bzero(3)" . OpenBSD . Consultado el 27 de noviembre de 2017 .
- ↑ "memccpy" . Pubs.opengroup.org . Consultado el 6 de marzo de 2014 .
- ↑ "mempcpy(3) - Página del manual de Linux" . Kernel.org . Consultado el 6 de marzo de 2014 .
- ↑ "strcasecmp(3) - Página del manual de Linux" . Kernel.org . Consultado el 6 de marzo de 2014 .
- ↑ "strcat_s, wcscat_s, _mbscat_s" . docs.microsoft.com . Consultado el 22 de abril de 2022 .
- ↑ "strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s, _mbsncat_s_l" . docs.microsoft.com . Consultado el 9 de diciembre de 2025 .
- ↑ "strcpy_s, wcscpy_s, _mbscpy_s, _mbscpy_s_l" . docs.microsoft.com . Consultado el 22 de abril de 2022 .
- ↑ "strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l, _tcsncpy_s, _tcsncpy_s_l, _tcsnccpy_s, _tcsnccpy_s_l" . docs.microsoft.com . Consultado el 9 de diciembre de 2025 .
- ↑ "strdup" . Pubs.opengroup.org . Consultado el 6 de marzo de 2014 .
- ↑ "strerror(3) - Página del manual de Linux" . man7.org . Consultado el 3 de noviembre de 2019 .
- 1 2 "strlcpy, strlcat — copia y concatenación de cadenas con límite de tamaño" . OpenBSD . Consultado el 26 de mayo de 2016 .
- 1 2 3 4 Todd C. Miller; Theo de Raadt (1999). "strlcpy y strlcat: copia y concatenación de cadenas consistentes y seguras" . USENIX '99.
- ↑ "strsignal" . Pubs.opengroup.org . Consultado el 6 de marzo de 2014 .
- ↑ «strok» . Pubs.opengroup.org . Consultado el 6 de marzo de 2014 .
- ↑ Todd C. Miller. "strlcpy.c" . Referencia cruzada de BSD .
- ↑ Todd C. Miller. "strlcat.c" . Referencia cruzada de BSD .
- ↑ Miller, Damien (octubre de 2005). "Portabilidad segura" (PDF) . Recuperado el 26 de junio de 2016.
Esta API [strlcpy y strlcat] ha sido adoptada por la mayoría de los sistemas operativos modernos y muchos paquetes de software independientes [...]. La excepción notable es la biblioteca estándar C de GNU, glibc, cuyo mantenedor se niega rotundamente a incluir estas API mejoradas, etiquetándolas como "basura BSD terriblemente ineficiente", a pesar de la evidencia previa de que son más rápidas en la mayoría de los casos que las API que reemplazan.
- ↑ Lista de correo libc-alpha Archivada el 9 de junio de 2007 en Wayback Machine , mensajes seleccionados del hilo del 8 de agosto de 2000: 53 , 60 , 61
- ↑ Los pros y los contras de strlcpy(); LWN.net
- ↑ "Añadir strlcpy() a glibc" . lwn.net .
El manejo correcto de cadenas significa que siempre sabrás la longitud de tus cadenas y, por lo tanto, podrás usar memcpy (en lugar de strcpy).
- ↑ – Manual de funciones de la biblioteca de Linux de ManKier.com: "Sin embargo, cabe cuestionar la validez de tales optimizaciones, ya que contradicen el propósito mismo de strlcpy() y strlcat(). De hecho, la primera versión de esta página del manual contenía un error."
- ↑ "libbsd" . Consultado el 21 de noviembre de 2022 .
- ↑ "root/src/string/strlcpy.c" . Consultado el 28 de enero de 2017 .
- ↑ "root/src/string/strlcat.c" . Consultado el 28 de enero de 2017 .
- ↑ strlc{py|at} commit
- ↑ Discusión sobre strlcpy y strlcat en glibc 2.38 en Hacker News
- ↑ "strlcat" . Pubs.opengroup.org . Consultado el 5 de septiembre de 2024 .
- ↑ Lovell, Martyn. "Repela los ataques a tu código con las bibliotecas seguras de C y C++ de Visual Studio 2005" . Consultado el 13 de febrero de 2015 .
- ↑ Biblioteca Safe C. "La biblioteca Safe C proporciona comprobación de límites de memoria y funciones de cadena según ISO/IEC TR24731" . Sourceforge . Consultado el 6 de marzo de 2013 .
- ↑ "El borrador estándar C11" (PDF) . §K.3.1.4p2 . Consultado el 13 de febrero de 2013 .
{{cite web}}: CS1 mantenimiento: ubicación ( enlace ) - ↑ "El borrador estándar C11" (PDF) . §K.3.6.1.1p4 . Consultado el 13 de febrero de 2013 .
{{cite web}}: CS1 mantenimiento: ubicación ( enlace ) - ↑ "Validación de parámetros" . 21 de octubre de 2022.
- ↑ Danny Kalev. "Lo están haciendo otra vez" . InformIT. Archivado del original el 15 de enero de 2012. Consultado el 10 de noviembre de 2011 .
- ↑ "Experiencia práctica con el Anexo K: interfaces de verificación de límites" . Consultado el 5 de noviembre de 2015 .
- ↑ "MSC06-C. Cuidado con las optimizaciones del compilador" . Estándar de codificación C de SEI CERT .
- ↑ – Manual de funciones de la biblioteca de FreeBSD
Enlaces externos
- Copia rápida de memoria en C , múltiples ejemplos de código en C para diferentes tipos de arquitecturas de instrucciones de CPU.
- C (lenguaje de programación)
- Biblioteca estándar de C
- Cadenas de caracteres (informática)