strncpy
¿Es legal pasar una cadena no terminada en nulo a strncmp en C? (2)
La función strncmp no compara más de n caracteres (los caracteres que siguen a un carácter nulo no se comparan) desde la matriz a la que apunta s1 a la matriz a la que apunta s2.
La especificación 7.24.4.2 dice eso. Estándar C11.
Los caracteres que no siguen a caracteres de caracteres nulos no se comparan, por lo que se espera una matriz o cadena de caracteres de final nulo. 1
También puede utilizar caracteres terminados no nulos aquí, pero en ese caso tenemos que especificar la longitud hasta la cual tenemos que verificarlo, lo que es útil en algunos casos.
Correcciones
[1] Que los caracteres que no siguen un carácter nulo no se comparan no significa que strncmp
espere cadenas terminadas en nulo. Simplemente significa que strncmp
necesita un caso especial para decir (por ejemplo) que abc/0def
... y abc/0xyz
... se comparan de la misma manera. No hay nada de malo en comparar dos matrices de caracteres que no estén terminadas en nulo (hasta la longitud especificada) o comparar una matriz de caracteres terminada en nulo con otra que no esté terminada en nulo
Esto se añade directamente del comentario de David Hammen.
Tengo una matriz de 16 bytes que contiene el nombre de un segmento de ejecutable.
char segname[16];
Si la longitud del nombre del segmento es inferior a 16 bytes, el resto se rellena con bytes nulos. De lo contrario, no hay un byte nulo de terminación.
Quiero comparar segname
con varias cadenas, por ejemplo, __text
.
¿Es legal llamar a strncmp
con una cadena que no termina en nulo?
Este post asume que es legal. Este código fuente lo hace legal también. Pero la página de mi hombre dice:
La función
strncmp()
compara lexicográficamente las cadenas terminadas en nulos1
ys2
.
El tamaño pasado a strncmp
será el tamaño de segname
.
Me pregunto a qué debería referirme.
De acuerdo con la norma C99, sección 7.21.4.4, §3., Es legal:
La función
strncmp
devuelve un número entero mayor que, igual a, o menor que cero, de acuerdo con lo anterior, ya que la matriz posiblemente terminada en nulo apuntada pors1
es mayor que, igual o menor que la matriz posiblemente terminada por nulo apuntada pors2
.
Tenga en cuenta, sin embargo, que dice matriz de caracteres. Por definición, si una matriz de caracteres no está terminada en nulo, no es una cadena.