Comparar cadena literal vs matriz de caracteres

No puedo encontrar una respuesta similar a esto.

char buffer[] = {'a', '0'}; char p2[] = "a"; printf("%d", buffer==p2); // prints 0 

¿Cómo hago esta comparación? ¿Es esta una pregunta similar? ¿Cómo comparo una cadena literal a una matriz de caracteres?

 char buffer[] = {'a', '0'}; printf("%d", buffer=="a"); // prints 0 

Los anteriores son solo ejemplos, pero realmente necesito esto:

  char buffer[] = {'e','a','b','g','e','l','e','g','o','n','\000','p','k','n','m','l','\000','j', 'i', 'h'}; printf("%d", buffer=="eabgelegon\000pknml\000jih"); 

No puedo usar ninguna otra función.

Las matrices (o cadenas) en muchas circunstancias, se convierten a la dirección de su primer elemento.

En su código, dentro del printf() , estas direcciones están siendo comparadas.

Para comparar las cosas a las que apuntan las direcciones necesita strcmp() (para cadenas reales) o memcmp() (para datos binarios)

 char buffer[] = {'e','a','b','g','e','l','e','g','o','n','\000','p','k','n','m','l','\000','j', 'i', 'h'}; int equal1 = memcmp(buffer, "eabgelegon\000pknml\000jih", 20); printf("%d", equal1); int equal2 = memcmp(buffer, "eabgelegon\000XXXXXXXXX", 20); printf("%d", equal2); int equal3 = strcmp(buffer, "eabgelegon\000pknml\000jih"); printf("%d", equal3); int equal4 = strcmp(buffer, "eabgelegon\000XXXXXXXXX"); printf("%d", equal4); 

Ninguna de las 3 buffer de OP se describe mejor como cadenas C. Simplemente arrays de char .

 char buffer[] = {'a', '0'}; // No terminating \0 char buffer[] = {'a', '0'}; // No terminating \0 // No terminating \0 yet has embedded \0 char buffer[] = {'e','a','b','g','e','l','e','g','o','n','\000','p','k','n','m','l','\000','j', 'i', 'h'}; 

Como OP “no puede usar ninguna otra función” …

Encontrar rango de buffer memoria indexable válido y p2 . El rango indexable válido del buffer es de 0 a sizeof(buffer) - 1 .

Lo mismo para p2 (el literal de cadena) es complicado. Si p2 era una cadena C típica, el rango es 0 a strlen(p2) + 1 . Pero un literal de cadena como "eabgelegon\000pknml\000jih" tiene incrustado '\0' (así como un '\0' terminación), por lo que su rango no se puede determinar en tiempo de ejecución con strlen() , sino solo en tiempo de comstackción con sizeof() .

Supongamos que la comparación no debe incluir el literal de cadena '\0' .

  char buffer[] = 'e','a','b','g','e','l','e','g','o','n','\000','p','k','n','m','l','\000','j', 'i', 'h'}; char p2[] = "eabgelegon\000pknml\000jih"; // matches //char p2[] = "eabgelegon\000pknml\000ji "; // fails //char p2[] = "eabgelegon\000pk ml\000jih"; // fails size_t buffer_size = sizeof(buffer); size_t p2_size = sizeof(p2); // p2 should be 1 longer than buffer due to its terminating \0 if (buffer_size + 1 != p2_size) return NOT_EQUAL; size_t i; for (i=0; i 

Nota: sizeof() no es una función en C, sino un operador.

Si no lo reconoces:

 char buffer[] = {'a', '\0'}; char p2[] = "a"; 

buffer y p2 son exactamente iguales. Con el buffer , declara una matriz de caracteres y asigna el primer carácter como 'a' y luego un carácter explícito de terminación nula '\0' que le da una cadena "a" . Con p2 , asigna la cadena literal "a" y el carácter de terminación nula se agrega automáticamente al final. De cualquier manera, obtienes lo mismo, el buffer y p2 mantienen la cadena "a" .