¿Cuándo/por qué es necesario ‘\ 0’ para marcar el final de una matriz (char)?

7 minutos de lectura

avatar de usuario
Estricto

Así que acabo de leer un ejemplo de cómo crear una matriz de caracteres que representan una cadena.

El carácter nulo \0 se coloca al final de la matriz para marcar el final de la matriz. ¿Es esto necesario?

Si creé una matriz de caracteres:

char line[100]; 

y pon la palabra:

"hello\n"

en él, los caracteres se colocarían en los primeros seis índices line[0]line[6]¿entonces el resto de la matriz se llenaría con caracteres nulos de todos modos?

Este libro dice que es una convención que, por ejemplo, la constante de cadena "hello\n" se coloca en una matriz de caracteres y termina con \0.

Tal vez no entiendo este tema en toda su extensión y me alegraría que me aclararan.

  • \0 se usa para marcar el final de la cadena de caracteres en C. La mayoría de las funciones de la biblioteca C std requieren que la cadena termine de esta manera para poder funcionar.

    – eclipsado

    26 de noviembre de 2016 a las 18:12

  • Dado que C no sabe cuánto mide su cadena, debe marcar el final con un \0 para que sepa que ha llegado al final de su cadena.

    –Cedric Martens

    26 de noviembre de 2016 a las 18:17

  • También puede usar cadenas de Pascal en C. Por supuesto, las funciones existentes no esperarán eso, por lo que no funcionarán juntas.

    – harold

    26 de noviembre de 2016 a las 18:19

  • Posible duplicado de ¿Cuál es la justificación de las cadenas terminadas en nulo?

    – Eli Sadoff

    27 de noviembre de 2016 a las 5:23

  • Posible duplicado de ¿Es necesario proporcionar el carácter nulo al declarar la matriz de un carácter?

    – phuclv

    30 de mayo de 2018 a las 1:59

avatar de usuario
Hormiga

Él \0 carácter no marca el “final de la matriz”. Él \0 personaje marca el final de la cuerda almacenado en una matriz de caracteres, Si (y solo si) esa matriz de caracteres está destinada a almacenar una cadena.

Una matriz de caracteres es solo una matriz de caracteres. Almacena valores enteros independientes (char es solo un tipo de entero pequeño). Una matriz de caracteres no tiene que terminar en \0. \0 no tiene un significado especial en una matriz de caracteres. Es solo un valor cero.

Pero a veces las matrices de caracteres se utilizan para almacenar instrumentos de cuerda. Una cadena es una secuencia de caracteres terminada por \0. Entonces, si desea usar su matriz de caracteres como una cadena tienes que terminar tu cadena con un \0.

Entonces, la respuesta a la pregunta sobre \0 ser “necesario” depende de lo que esté almacenando en su matriz de caracteres. Si está almacenando un cuerdaentonces tendrás que terminarlo con un \0. Si está almacenando algo que no es una cadena, entonces \0 no tiene ningún significado especial en absoluto.

avatar de usuario
MayurK

‘\0’ no es necesario si lo está utilizando como matriz de caracteres. Pero si usa una matriz de caracteres como cadena, debe poner ‘\ 0’. No hay un tipo de cadena separado en C.

Hay varias formas de declarar una matriz de caracteres.

Ex:

char str1[]    = "my string";
char str2[64]  = "my string";
char str3[]    = {'m', 'y', ' ', 's', 't', 'r', 'i', 'n', 'g', '\0'};
char str4[64]  = {'m', 'y', ' ', 's', 't', 'r', 'i', 'n', 'g', '\0'};

Todas estas matrices tienen la misma cadena “mi cadena”. En str1 y str2, el carácter ‘\0’ se agrega automáticamente, pero en los otros dos, debe agregarlo explícitamente.

avatar de usuario
Vlad de Moscú

¿Cuándo/por qué es necesario ‘\ 0’ para marcar el final de una matriz (char)?

El cero final es necesario si una matriz de caracteres contiene una cadena. Esto permite encontrar el punto donde termina una cuerda.

En cuanto a su ejemplo que creo que se ve de la siguiente manera

char line[100] = "hello\n";

entonces, para empezar, el literal de cadena tiene 7 caracteres. Es una cadena e incluye el cero final. Este literal de cadena tiene tipo char[7]. Puedes imaginarlo como

char no_name[] = { 'h', 'e', 'l', 'l', 'o', '\n', '\0' };

Cuando se usa un literal de cadena para inicializar una matriz de caracteres, todos sus caracteres se usan como inicializadores. Entonces, en relación con el ejemplo, los siete caracteres del literal de cadena se usan para inicializar los primeros 7 elementos de la matriz. Todos los demás elementos de la matriz que no se inicializaron con los caracteres del literal de cadena se inicializarán implícitamente con ceros.

Si desea determinar cuánto tiempo se almacena la cadena en una matriz de caracteres, puede usar la función C estándar strlen declarado en el encabezado <string.h>. Devuelve el número de caracteres en una matriz antes del cero final.

Considere el siguiente ejemplo

#include <stdio.h>
#include <string.h>

int main(void) 
{
    char line[100] = "hello\n";

    printf( "The size of the array is %zu"
            "\nand the length of the stored string \n%s is %zu\n",
            sizeof( line ), line, strlen( line ) );

    return 0;
}

Su salida es

The size of the array is 100
and the length of the stored string 
hello
 is 6

En C, puede usar un literal de cadena para inicializar una matriz de caracteres excluyendo el cero final del literal de cadena. Por ejemplo

char line[6] = "hello\n";

En este caso, no puede decir que la matriz contiene una cadena porque la secuencia de símbolos almacenada en la matriz no tiene el cero final.

Necesita el carácter nulo para marcar el final de la cadena. C no almacena ninguna información interna sobre la longitud de la matriz de caracteres o la longitud de una cadena, por lo que el carácter/byte nulo \0 marca donde termina.

Esto solo es necesario para instrumentos de cuerdasin embargo, puede tener cualquier matriz ordinaria de caracteres que no represente una cadena.

Por ejemplo, prueba este fragmento de código:

#include <stdio.h>

int main(void) {
    char string[1];
    string[0] = 'a';
    printf("%s", string);
}

Tenga en cuenta que la matriz de caracteres está completamente llena de datos. Por lo tanto, no hay un byte nulo para marcar el final. Ahora, printf seguirá imprimiendo hasta que llegue a un byte nulo; esto estará en algún lugar más allá del final de la matriz, por lo que imprimirá una gran cantidad de basura además de solo “a”.

Ahora, prueba esto:

#include <stdio.h>

int main(void) {
    char string[2];
    string[0] = 'a';
    string[1] = '\0';
    printf("%s", string);
}

Solo imprimirá “a”, porque el final de la cadena está marcado explícitamente.

avatar de usuario
wj127

La longitud de una cadena C (una matriz que contiene los caracteres y termina con un carácter ‘\0’) se encuentra buscando el (primer) byte NUL. \0 es el carácter cero. En C se usa principalmente para indicar la terminación de una cadena de caracteres. Te pongo un ejemplo:

digamos que ha escrito una palabra en un archivo:

word = malloc(sizeof(cahr) * 6);
word = "Hello";
fwrite(word, sizeof(char), 6, fp);

donde en word asignamos espacio para los 5 caracteres de “Hola” más uno más para su terminación ‘\0’. Él fp es el archivo. Y ahora, escribimos otra palabra después de la última:

word2 = malloc(sizeof(cahr) * 7);
word2 = "world!";
fwrite(word2, sizeof(char), 7, fp);

Así que ahora, leamos las dos palabras:

char buff = malloc(sizeof(char)*1000); // See that we can store as much space as we want, it won't change the final result
/* 13 = (5 chacater from 'Hello')+(1 character of the \0)+(6 characters from 'world!')+(1 character from the \0) */
fread(buff, sizeof(char), 13, fp); // We read the words 'Hello\0' and 'world!\0'
printf("the content of buff is: %s", buff); // This would print 'Hello world!'

Esto último se debe al final \0 carácter, así C sabe que hay dos cadenas separadas en el búfer. Si no hubiésemos puesto eso \0 carácter al final de ambas palabras, y repita el mismo ejemplo, la salida sería "Helloworld!"
¡Esto se puede usar para muchos métodos y funciones de cadenas!.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad