Manejo de cuerdas C

Manejo de cadenas en el lenguaje de programación C

El lenguaje de programación C tiene un conjunto de funciones que implementan operaciones sobre cadenas (cadenas de caracteres y cadenas de bytes) en su biblioteca estándar . Se admiten varias 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 NUL " con valor numérico 0.

El único soporte para cadenas en el lenguaje de programación propiamente dicho es que el compilador traduce las constantes de cadena entre comillas en cadenas terminadas en nulo.

Definiciones

Una cadena se define como una secuencia contigua de unidades de código terminadas en la primera unidad de código cero (a menudo denominada 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 ve 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 es siempre una unidad de código más que la longitud, ya que se necesita espacio para almacenar el terminador cero.

En general, el término cadena significa una cadena donde la unidad de código es de tipo char, que es exactamente de 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 es de 16 o 32 bits en las máquinas modernas. Esto fue pensado para Unicode , pero es cada vez más común utilizar UTF-8 en cadenas normales para Unicode.

Las cadenas se pasan a las funciones pasando un puntero a la primera unidad de código. Como char *y wchar_t *son tipos diferentes, las funciones que procesan cadenas anchas son diferentes de las que procesan cadenas normales y tienen nombres diferentes.

Los literales de cadena ( "text"en el código fuente de C) se convierten en matrices durante la compilación. [2] El resultado es una matriz de unidades de código que contiene todos los caracteres más una unidad de código cero final. En C90 L"text"produce una cadena ancha. Un literal de cadena puede contener la unidad de código cero (una forma es ponerlo \0en la fuente), pero esto hará que la cadena termine en ese punto. El resto del literal se colocará en la memoria (con otra unidad de código cero agregada al final) pero es imposible saber si esas unidades de código se tradujeron del 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 ocurrencia de la unidad de código cero del tipo apropiado ( charo wchar_t). En consecuencia, una cadena de bytes ( char*) puede contener caracteres no 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 puede ser distinta de cero, su byte alto o bajo puede ser cero). Las codificaciones que se pueden almacenar en cadenas anchas se definen por el ancho de wchar_t. En la mayoría de las implementaciones, wchar_tes de al menos 16 bits, por lo que se pueden almacenar todas las codificaciones de 16 bits, como UCS-2 . Si wchar_tes de 32 bits, se pueden almacenar codificaciones de 32 bits, como UTF-32 . (El estándar requiere un "tipo que admita cualquier carácter ancho", lo que en Windows ya no es válido desde el cambio de UCS-2 a UTF-16. Esto fue reconocido como un defecto en el estándar y corregido 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 utilizar tanto en cadenas de bytes como en cadenas anchas. La longitud de la cadena y los desplazamientos se miden en bytes o wchar_tno en "caracteres", lo que puede resultar confuso para los programadores principiantes. UTF-8 y Shift JIS se utilizan a menudo en cadenas de bytes de C, mientras que UTF-16 se utiliza a menudo en cadenas anchas de C cuando wchar_tes de 16 bits. Truncar cadenas con caracteres de ancho variable mediante funciones como strncpypuede producir secuencias no válidas al final de la cadena. Esto puede ser inseguro si las partes truncadas son interpretadas por un código que supone 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 caracteres y cadenas literales con prefijo u8 se cambiaron a y respectivamente.char foo[512] = "φωωβαρ";wchar_t foo[512] = L"φωωβαρ";wchar_tchar\xNN\uNNNNu8char foo[512] = u8"φωωβαρ";char8_tchar8_tchar8_t[]

Características

Terminología

En la documentación histórica, el término "carácter" se utilizaba a menudo en lugar de "byte" para las cadenas de C, lo que lleva a muchos [¿ quiénes? ] a creer que estas funciones de alguna manera no funcionan para UTF-8 . De hecho, todas las longitudes se definen como en bytes y esto es cierto en todas las implementaciones, y estas funciones funcionan tanto con UTF-8 como con codificaciones de un solo byte. La documentación de BSD se ha corregido para dejar esto claro, pero la documentación de POSIX, Linux y Windows todavía utiliza "carácter" en muchos lugares donde "byte" o "wchar_t" es el término correcto.

Las funciones para manejar buffers de memoria pueden procesar secuencias de bytes que incluyen bytes nulos como parte de los datos. Los nombres de estas funciones suelen comenzar con mem, en lugar del strprefijo.

Encabezados

La mayoría de las funciones que operan en cadenas de C se declaran en el string.hencabezado ( cstringen C++), mientras que las funciones que operan en cadenas de C de ancho amplio se declaran en el wchar.hencabezado ( cwcharen C++). Estos encabezados también contienen declaraciones de funciones utilizadas para manejar buffers de memoria; por lo tanto, el nombre es algo inapropiado.

Las funciones declaradas en string.hson extremadamente populares ya que, como parte de la biblioteca estándar de C , se garantiza que funcionan en cualquier plataforma que admita C. Sin embargo, existen algunos problemas de seguridad con estas funciones, como posibles desbordamientos de búfer cuando no se usan con cuidado y de manera adecuada, lo que hace que los programadores prefieran 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 constante al aceptar un constpuntero de cadena y devolver un puntero no constdentro de la cadena. Para corregir esto, algunas se han separado en dos funciones sobrecargadas en la versión C++ de la biblioteca estándar.

Constantes y tipos

NombreNotas
NULOMacro que se expande a la constante de puntero nulo ; es decir, una constante que representa un valor de puntero que se garantiza que no es una dirección válida de un objeto en la memoria.
char_t_esTipo utilizado para una unidad de código en cadenas "anchas". En Windows , la única plataforma que utiliza wchar_t ampliamente, se define como de 16 bits [8], lo que era suficiente para representar cualquier carácter Unicode ( UCS-2 ), pero ahora solo es suficiente para representar una unidad de código UTF-16 , que puede ser la mitad de un punto de código. En otras plataformas se define como de 32 bits y siempre cabe un punto de código Unicode. El estándar C solo requiere que wchar_t sea lo suficientemente ancho para contener el conjunto de caracteres más ancho entre las configuraciones regionales del sistema admitidas [9] y que sea mayor o igual en tamaño que char [10] .
invierno_tTipo entero que puede contener cualquier valor de un wchar_t, así como el valor de la macro WEOF. Este tipo no se modifica con las promociones de enteros. Normalmente es un valor con signo de 32 bits.
char8_t [11]Parte del estándar C desde C23, en <uchar.h> , un tipo que es adecuado para almacenar caracteres UTF-8. [12]
carácter16_t [13]Parte del estándar C desde C11 , [14] en <uchar.h> , un tipo capaz de almacenar 16 bits incluso si wchar_t tiene otro tamaño. Si la macro se define como 1 , el tipo se utiliza para UTF-16 en ese sistema. Este es siempre el caso en C23. [15] C++ no define una macro de este tipo, pero el tipo siempre se utiliza para UTF-16 en ese lenguaje. [16]__STDC_UTF_16__
char32_t [13]Parte del estándar C desde C11, [17] en <uchar.h> , un tipo capaz de almacenar 32 bits incluso si wchar_t tiene otro tamaño. Si la macro se define como 1 , el tipo se utiliza para UTF-32 en ese sistema. Este es siempre el caso en C23. [15] C++ no define una macro de este tipo, pero el tipo siempre se utiliza para UTF-32 en ese lenguaje. [16]__STDC_UTF_32__
estado_mbContiene toda la información sobre el estado de conversión requerido de una llamada a una función a otra.

Funciones

Cadena de
bytes

Cuerda ancha
Descripción [nota 1]

Manipulación de cadenas
secuencia [18]archivo wcscpy [19]Copia una cadena a otra
secuencia [20]archivo wcsncpy [21]Escribe exactamente n bytes, copiando desde la fuente o agregando valores nulos
cadena [22]gato sanitario [23]Añade una cadena a otra
estrangulamiento [24]gato negro [25]No añade más de n bytes de una cadena a otra
estructura de cadena [26]wcsxfrm [27]Transforma una cadena según la configuración regional actual

Examen de cuerdas
estrías [28]cesar [29]Devuelve la longitud de la cadena.
cadena [30]wcscmp [31]Compara dos cadenas ( comparación de tres vías )
cadena de montaje [32]wcsncmp [33]Compara un número específico de bytes en dos cadenas
cadena de caracteres [34]wcscoll [35]Compara dos cadenas según la configuración regional actual
estrangulador [36]wcschr [37]Encuentra la primera aparición de un byte en una cadena
estrangulador [38]wcsrchr [39]Encuentra la última aparición de un byte en una cadena
estrangulamiento [40]wcsspn [41]Devuelve el número de bytes iniciales en una cadena que están en una segunda cadena
secuencia de comandos [42]PNSCSP [43]Devuelve el número de bytes iniciales en una cadena que no están en una segunda cadena
freno de cadena [44]Recuperación de datos [45]Encuentra en una cadena la primera aparición de un byte en un conjunto
cadena [46]cadena de caracteres [47]Encuentra la primera aparición de una subcadena en una cadena
carrera [48]wcstok [49]Divide una cadena en tokens
Misceláneasterror [50]Devuelve una cadena que contiene un mensaje derivado de un código de error

Manipulación de la memoria
conjunto de memorias [51]conjunto de memorias [52]Rellena un búfer con un byte repetido. Desde C23 , se agregó memset_explicit() para borrar datos confidenciales.
memoriamcpy [53]memoriamcpy [54]Copia un buffer a otro. Desde C23 , se agregó memccpy() para concatenar cadenas de manera eficiente.
memoria [55]moverme [56]Copia un búfer a otro, posiblemente superpuesto, búfer
memoriamcmp [57]archivo wmemcmp [58]Compara dos buffers (comparación de tres vías)
miembro [59]wmemchr [60]Encuentra la primera aparición de un byte en un búfer
  1. ^ Para funciones de cadena ancha, sustituya wchar_t por "byte" en la descripción

Funciones multibyte

NombreDescripción
mblen [61]Devuelve el número de bytes en el siguiente carácter multibyte
mbtowc [62]Convierte el siguiente carácter multibyte en un carácter ancho
tumba de wcto [63]Convierte un carácter ancho en su representación multibyte
mbstowcs [64]Convierte una cadena multibyte en una cadena ancha
tumbas de wcs [65]Convierte una cadena ancha en una cadena multibyte
desviado [66]Convierte un carácter de un solo byte en un carácter ancho, si es posible
OCTUBRE [67]Convierte un carácter ancho en un carácter de un solo byte, si es posible
sinit [68]Comprueba si un objeto de estado representa el estado inicial
mblen [69]Devuelve el número de bytes en el siguiente carácter multibyte, dado el estado
mbrtowc [70]Convierte el siguiente carácter multibyte en un carácter ancho, según el estado
tumba de wcr [71]Convierte un carácter ancho en su representación multibyte, según el estado
mbsrtowcs [72]Convierte una cadena multibyte en una cadena ancha, dado el estado
tumbas de wcsrt [73]Convierte una cadena ancha en una cadena multibyte, dado el estado
mbrtoc8 [74]Convierte el siguiente carácter multibyte en un carácter UTF-8, según el estado
c8rtomb [75]Convierte un único punto de código de UTF-8 a una representación de carácter multibyte estrecha, según el estado
mbrtoc16 [76]Convierte el siguiente carácter multibyte en un carácter UTF-16, según el estado
c16rtomb [77]Convierte un único punto de código de UTF-16 a una representación de carácter multibyte estrecha, según el estado
mbrtoc32 [78]Convierte el siguiente carácter multibyte en un carácter UTF-32, según el estado
c32rtomb [79]Convierte un único punto de código de UTF-32 a una representación de carácter multibyte estrecha, según el estado

Todas estas funciones necesitan unaestado_mbobjeto, originalmente en memoria estática (haciendo 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 lo necesitan. Sin embargo, estas funciones se diseñaron asumiendo que elWCLa codificación no es una codificación de ancho variable y, por lo tanto, está diseñada para tratar exactamente con unachar_t_esa la vez, pasándolo por valor en lugar de usar un puntero de cadena. Como UTF-16 es una codificación de ancho variable,estado_mbSe 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

Cadena de
bytes

Cuerda ancha
Descripción [nota 1]
de [83]convierte una cadena en un valor de punto flotante ('atof' significa 'ASCII a flotante')
atolón de atoi atolón [ 84]

convierte una cadena en un entero ( C99 ) ('atoi' significa 'ASCII a entero')
strtof ( C99 ) [85] strtod [86] strtold ( C99 ) [87]

wcstof ( C99 ) [88] wcstod [89] wcstold ( C99 ) [90]

convierte una cadena en un valor de punto flotante
strtol strtol [91]
wcstol wcstoll [92]
convierte una cadena en un entero con signo
Ströul Ströul [93]
wcstoul wcstoul [94]
convierte una cadena en un entero sin signo
  1. ^ Aquí, cadena se refiere a una cadena de bytes o a una cadena ancha.

La biblioteca estándar de C contiene varias funciones para conversiones numéricas. Las funciones que se ocupan de cadenas de bytes se definen en el stdlib.hencabezado ( cstdlibheader en C++). Las funciones que se ocupan de cadenas anchas se definen en el wchar.hencabezado ( cwcharheader en C++).

Las funciones strchr, bsearch, strpbrk, strrchr, strstr, memchry sus contrapartes amplias no son constantes-correctas , ya que aceptan un constpuntero de cadena y devuelven un no- constpuntero 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 strtoxxxfunciones, por lo que ni la 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]

NombreFuenteDescripción
bcero [97] [98]BSDLlena un buffer con cero bytes, obsoleto por memset
memoriaccpy [99]SVIDParte del estándar C desde C23 , copia entre dos áreas de memoria no superpuestas y se detiene cuando se encuentra un byte determinado.
memoria de control [100]ÑUuna variante de memcpy que devuelve un puntero al byte siguiente al último byte escrito
strcasecmp [101]BSDVersión de strcmp que no distingue entre mayúsculas y minúsculas
cadena_s [102]Ventanasuna variante de strcat que verifica el tamaño del búfer de destino antes de copiar
cadena_s [103]Ventanasuna variante de strcpy que verifica el tamaño del búfer de destino antes de copiar
subir y bajar [104]Sistema de archivos POSIXParte del estándar C desde C23, asigna y duplica una cadena
error_de_estr [105]POSIX 1, GNUuna variante de strerror que es segura para subprocesos. La versión GNU es incompatible con la versión POSIX.
estricto [106]VentanasVersión de strcmp que no distingue entre mayúsculas y minúsculas
secuencia de comandos [107]BSDuna variante de strcpy que trunca el resultado para que quepa en el búfer de destino [108]
gato callejero [107]BSDuna variante de strcat que trunca el resultado para que quepa en el búfer de destino [108]
señal de cadena [109]POSIX:2008Devuelve una representación en cadena de un código de señal . No es seguro para subprocesos.
cadena_r [110]Sistema de archivos POSIXuna variante de strtok que es segura para subprocesos

Reemplazos

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 (estaban destinadas a manipular búferes de cadenas de tamaño fijo con relleno nulo, un formato de datos menos comúnmente usado 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]

Las funciones de reemplazo más populares 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 la detección del 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 C de GNU (usada por el software en Linux), sobre la base de que supuestamente son ineficientes, [113] fomentan el uso de cadenas de C (en lugar de alguna forma alternativa superior de cadena), [114] [115] y ocultan otros errores potenciales. [116] [117] Incluso cuando glibc no había agregado soporte, strlcat y strlcpy se han implementado en varias otras bibliotecas de C, incluidas las de OpenBSD, FreeBSD , NetBSD , Solaris , OS X y QNX , así como en bibliotecas de C alternativas para Linux, como libbsd, introducida en 2008, [118] y musl , introducida en 2011, [119] [120] y el código fuente se agregó directamente a otros proyectos como SDL , GLib , ffmpeg , rsync e incluso internamente en el kernel de Linux . Esto cambió en 2024, las preguntas frecuentes de glibc señalan que a partir de glibc 2.38, el código se ha confirmado [121] y, por lo tanto, se agregó. [122] Estas funciones se estandarizaron como parte de POSIX.1-2024, [123] el Austin Group Defect Tracker ID 986 rastreó algunas discusiones sobre dichos planes para POSIX.

A veces se utilizan memcpy[53] o memmove[55] , ya que pueden ser más eficientes que strcpylos que no comprueban repetidamente si hay valores NUL (esto es menos cierto en los procesadores modernos). Dado que necesitan una longitud de búfer como parámetro, la configuración correcta de este parámetro puede evitar desbordamientos de búfer.

Como parte de su Ciclo de vida de desarrollo de seguridad 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 del C11 opcional (Anexo K) propuesto por ISO/IEC WDTR 24731. [125] Estas funciones realizan varias comprobaciones, incluida la de si la cadena es demasiado larga para caber en el búfer. Si las comprobaciones fallan, se llama a una función "controlador de restricción de tiempo de ejecución" especificada por el usuario, [126] que generalmente 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 es un intento de Microsoft de encerrar a los desarrolladores en 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 propone la eliminación del Anexo K para la próxima revisión del estándar C. [130] Se ha sugerido su uso memset_scomo una forma de evitar optimizaciones no deseadas del compilador. [131] [132]

Véase también

Notas

  1. ^ En GitHub, hay 7.813.206 usos de strlcpy, frente a 38.644 usos de strcpy_s(y 15.286.150 usos de strcpy). [ cita requerida ]

Referencias

  1. ^ abc "El borrador de la norma C99 + TC3" (PDF) . §7.1.1p1 . Consultado el 7 de enero de 2011 .{{cite web}}: Mantenimiento de CS1: ubicación ( enlace )
  2. ^ "El borrador estándar C99 + TC3" (PDF) . §6.4.5p7 . Consultado el 7 de enero de 2011 .{{cite web}}: Mantenimiento de CS1: ubicación ( enlace )
  3. ^ "El borrador de la norma C99 + TC3" (PDF) . Sección 6.4.5, nota 66. Consultado el 7 de enero de 2011 .{{cite web}}: Mantenimiento de CS1: ubicación ( enlace )
  4. ^ "Relajar los requisitos de wchar_t para que coincidan con las prácticas existentes" (PDF) .
  5. ^ "Tipos fundamentales". en.cppreference.com .
  6. ^ "El borrador de la norma C99 + TC3" (PDF) . §5.1.1.2 Fases de la traducción , pág . 1. Consultado el 23 de diciembre de 2011 .{{cite web}}: Mantenimiento de CS1: ubicación ( enlace )
  7. ^ "literales de cadena". en.cppreference.com . Consultado el 23 de diciembre de 2019 .
  8. ^ "c++ - ¿Cuál es el uso de wchar_t en la programación general?". Desbordamiento de pila . Consultado el 1 de agosto de 2022 .
  9. ^ "stddef.h - definiciones de tipos estándar". The Open Group . Consultado el 28 de enero de 2017 .
  10. ^ Gillam, Richard (2003). Unicode desmitificado: una guía práctica para programadores sobre el estándar de codificación. Addison-Wesley Professional. pág. 714. ISBN 9780201700527.
  11. ^ "char, wchar_t, char8_t, char16_t, char32_t". docs.microsoft.com . Consultado el 1 de agosto de 2022 .
  12. ^ "char8_t".
  13. ^ ab "<cuchar> (uchar.h)".
  14. ^ "char16_t".
  15. ^ ab "Reemplazo de macros de texto".
  16. ^ ab "Tipos fundamentales".
  17. ^ "char32_t".
  18. ^ ab "strcpy - cppreference.com". En.cppreference.com. 2 de enero de 2014. Consultado el 6 de marzo de 2014 .
  19. ^ "wcscpy - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  20. ^ "strncpy - cppreference.com". En.cppreference.com. 4 de octubre de 2013. Consultado el 6 de marzo de 2014 .
  21. ^ "wcsncpy - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  22. ^ ab "strcat - cppreference.com". En.cppreference.com. 8 de octubre de 2013. Consultado el 6 de marzo de 2014 .
  23. ^ "wcscat - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  24. ^ "strncat - cppreference.com". En.cppreference.com. 1 de julio de 2013. Consultado el 6 de marzo de 2014 .
  25. ^ "wcsncat - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  26. ^ "strxfrm - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  27. ^ "wcsxfrm - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  28. ^ "strlen - cppreference.com". En.cppreference.com. 27 de diciembre de 2013. Consultado el 6 de marzo de 2014 .
  29. ^ "wcslen - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  30. ^ "strcmp - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  31. ^ "wcscmp - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  32. ^ "strncmp - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  33. ^ "wcsncmp - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  34. ^ "strcoll - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  35. ^ "wcscoll - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  36. ^ "strchr - cppreference.com". En.cppreference.com. 23 de febrero de 2014. Consultado el 6 de marzo de 2014 .
  37. ^ "wcschr - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  38. ^ "strrchr - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  39. ^ "wcsrchr - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  40. ^ "strspn - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  41. ^ "wcsspn - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  42. ^ "strcspn - cppreference.com". En.cppreference.com. 31 de mayo de 2013. Consultado el 6 de marzo de 2014 .
  43. ^ "wcscspn - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  44. ^ "strpbrk - cppreference.com". En.cppreference.com. 31 de mayo de 2013. Consultado el 6 de marzo de 2014 .
  45. ^ "wcspbrk - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  46. ^ "strstr - cppreference.com". En.cppreference.com. 16 de octubre de 2013. Consultado el 6 de marzo de 2014 .
  47. ^ "wcsstr - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  48. ^ "strtok - cppreference.com". En.cppreference.com. 3 de septiembre de 2013. Consultado el 6 de marzo de 2014 .
  49. ^ "wcstok - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  50. ^ "strerror - cppreference.com". En.cppreference.com. 31 de mayo de 2013. Consultado el 6 de marzo de 2014 .
  51. ^ "memset - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  52. ^ "wmemset - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  53. ^ ab "memcpy - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  54. ^ "wmemcpy - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  55. ^ ab "memmove - cppreference.com". En.cppreference.com. 25 de enero de 2014. Consultado el 6 de marzo de 2014 .
  56. ^ "wmemmove - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  57. ^ "memcmp - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  58. ^ "wmemcmp - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  59. ^ "memchr - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  60. ^ "wmemchr - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  61. ^ "mblen - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  62. ^ "mbtowc - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  63. ^ "wctomb - cppreference.com". En.cppreference.com. 4 de febrero de 2014. Consultado el 6 de marzo de 2014 .
  64. ^ "mbstowcs - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  65. ^ "wcstombs - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  66. ^ "btowc - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  67. ^ "wctob - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  68. ^ "mbsinit - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  69. ^ "mbrlen - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  70. ^ "mbrtowc - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  71. ^ "wcrtomb - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  72. ^ "mbsrtowcs - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  73. ^ "wcsrtombs - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  74. ^ "mbrtoc8 - cppreference.com". En.cppreference.com.
  75. ^ "c8rtomb - cppreference.com". Es.cppreference.com.
  76. ^ "mbrtoc16 - cppreference.com". Es.cppreference.com.
  77. ^ "c16rtomb - cppreference.com". En.cppreference.com.
  78. ^ "mbrtoc32 - cppreference.com". Es.cppreference.com.
  79. ^ "c23rtomb - cppreference.com". En.cppreference.com.
  80. ^ "6.3.2 Representación del estado de la conversión". The GNU C Library . Consultado el 31 de enero de 2017 .
  81. ^ "root/src/multibyte/c16rtomb.c" . Consultado el 31 de enero de 2017 .
  82. ^ "Contenido de /stable/11/lib/libc/locale/c16rtomb.c" . Consultado el 31 de enero de 2017 .
  83. ^ "atof - cppreference.com". En.cppreference.com. 31 de mayo de 2013. Consultado el 6 de marzo de 2014 .
  84. ^ "atoi, atolón, atolón - cppreference.com". En.cppreference.com. 18 de enero de 2014 . Consultado el 6 de marzo de 2014 .
  85. ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 4 de febrero de 2014. Consultado el 6 de marzo de 2014 .
  86. ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 4 de febrero de 2014. Consultado el 6 de marzo de 2014 .
  87. ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 4 de febrero de 2014. Consultado el 6 de marzo de 2014 .
  88. ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  89. ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  90. ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  91. ^ "strtol, strtoll - cppreference.com". En.cppreference.com. 4 de febrero de 2014. Consultado el 6 de marzo de 2014 .
  92. ^ "wcstol, wcstoll - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  93. ^ "strtoul, strtoull - cppreference.com". En.cppreference.com. 4 de febrero de 2014. Consultado el 6 de marzo de 2014 .
  94. ^ "wcstoul, wcstoull - cppreference.com". En.cppreference.com . Consultado el 6 de marzo de 2014 .
  95. ^ "WG14-N3020: Funciones de la biblioteca estándar que preservan calificadores, v4" (PDF) . open-std.org . 13 de junio de 2022.
  96. ^ Fundamento del C99, 7.20.1.1
  97. ^ "bzero". The Open Group . Consultado el 27 de noviembre de 2017 .
  98. ^ "bzero(3)". OpenBSD . Consultado el 27 de noviembre de 2017 .
  99. ^ "memccpy". Pubs.opengroup.org . Consultado el 6 de marzo de 2014 .
  100. ^ "mempcpy(3) - Página del manual de Linux". Kernel.org . Consultado el 6 de marzo de 2014 .
  101. ^ "strcasecmp(3) - Página del manual de Linux". Kernel.org . Consultado el 6 de marzo de 2014 .
  102. ^ "strcat_s, wcscat_s, _mbscat_s". docs.microsoft.com . Consultado el 22 de abril de 2022 .
  103. ^ "strcpy_s, wcscpy_s, _mbscpy_s, _mbscpy_s_l". docs.microsoft.com . Consultado el 22 de abril de 2022 .
  104. ^ "strdup". Pubs.opengroup.org . Consultado el 6 de marzo de 2014 .
  105. ^ "strerror(3) - Página del manual de Linux". man7.org . Consultado el 3 de noviembre de 2019 .
  106. ^ "Cadena | stricmp()". C Programming Expert.com . Consultado el 6 de marzo de 2014 .
  107. ^ ab "strlcpy, strlcat: copia y concatenación de cadenas con límites de tamaño". OpenBSD . Consultado el 26 de mayo de 2016 .
  108. ^ abcd Todd C. Miller; Theo de Raadt (1999). "strlcpy y strlcat: copia y concatenación de cadenas segura y consistente". USENIX '99.
  109. ^ "strsignal". Pubs.opengroup.org . Consultado el 6 de marzo de 2014 .
  110. ^ "strok". Pubs.opengroup.org . Consultado el 6 de marzo de 2014 .
  111. ^ Todd C. Miller. "strlcpy.c". Referencia cruzada BSD .
  112. ^ Todd C. Miller. "strlcat.c". Referencia cruzada BSD .
  113. ^ Miller, Damien (octubre de 2005). "Secure Portability" (PDF) . Consultado 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 notable excepción es la biblioteca C estándar 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.
  114. ^ Lista de correo libc-alpha Archivado el 9 de junio de 2007 en Wayback Machine , mensajes seleccionados del hilo del 8 de agosto de 2000: 53, 60, 61
  115. ^ Los altibajos de strlcpy(); LWN.net
  116. ^ "Añadir strlcpy() a glibc". lwn.net . El manejo correcto de cadenas significa que siempre sabrás qué tan largas son tus cadenas y, por lo tanto, podrás usar memcpy (en lugar de strcpy).
  117. ^ strlcpy(3)  –  Manual de funciones de la biblioteca de Linux "Sin embargo, se puede cuestionar la validez de dichas optimizaciones, ya que anulan el propósito de strlcpy() y strlcat(). De hecho, la primera versión de esta página del manual lo tenía mal."
  118. ^ "libbsd" . Consultado el 21 de noviembre de 2022 .
  119. ^ "root/src/string/strlcpy.c" . Consultado el 28 de enero de 2017 .
  120. ^ "root/src/string/strlcat.c" . Consultado el 28 de enero de 2017 .
  121. ^ strlc{py|at} confirmación
  122. ^ https://news.ycombinator.com/item?id=36765747 [ URL desnuda ]
  123. ^ "strlcat". Pubs.opengroup.org . Consultado el 5 de septiembre de 2024 .
  124. ^ Lovell, Martyn. "Rechace los ataques a su código con las bibliotecas de C y C++ seguras de Visual Studio 2005" . Consultado el 13 de febrero de 2015 .
  125. ^ Biblioteca Safe C. "La biblioteca Safe C proporciona funciones de comprobación de límites de memoria y cadenas según ISO/IEC TR24731". Sourceforge . Consultado el 6 de marzo de 2013 .
  126. ^ "El borrador de la norma C11" (PDF) . §K.3.1.4p2 . Consultado el 13 de febrero de 2013 .{{cite web}}: Mantenimiento de CS1: ubicación ( enlace )
  127. ^ "El borrador de la norma C11" (PDF) . §K.3.6.1.1p4 . Consultado el 13 de febrero de 2013 .{{cite web}}: Mantenimiento de CS1: ubicación ( enlace )
  128. ^ "Validación de parámetros". 21 de octubre de 2022.
  129. ^ Danny Kalev. "Están en ello otra vez". InformIT. Archivado desde el original el 15 de enero de 2012. Consultado el 10 de noviembre de 2011 .
  130. ^ "Experiencia de campo con el Anexo K: interfaces de verificación de límites" . Consultado el 5 de noviembre de 2015 .
  131. ^ "MSC06-C. Tenga cuidado con las optimizaciones del compilador". Estándar de codificación C de SEI CERT .
  132. ^ memset_s(3)  –  Manual de funciones de la biblioteca de FreeBSD
  • Memcpy rápido en C, múltiples ejemplos de codificación en C para diferentes tipos de arquitecturas de instrucciones de CPU
Obtenido de "https://es.wikipedia.org/w/index.php?title=Manejo_de_cadenas_C&oldid=1244235040"