¿Por qué no matrices numéricas final con un ‘\0’ o carácter nulo?

¿Por qué no las matrices numéricas termina con un carácter nulo?

Por ejemplo,

char name[] = {'V', 'I', 'J', 'A', 'Y', '\0'};

Pero en el caso de matrices numéricas que no hay ningún signo de carácter nulo al final…

Por ejemplo,

int marks[] = {20, 22, 23};

¿Cuál es la razón detrás de todo esto?

  • char[]s no tienen que terminar en '\0', ya sea…
  • en Relación a la
  • Todas las respuestas a continuación no responder a la pregunta planteada.
  • Sí, lo sé compañero que aún no ha contestado correctamente, pero tengo el punto de que alguien la respuesta de que por qué ‘\0’ no está incluido al final de matrices numéricas 🙂
  • Hágase esta pregunta: ¿Puede usted pensar en una razón por la que usted quiere un array de enteros, donde al menos uno de ellos es 0 ? Por ejemplo, int a[] = {0,1,2,3,4}; El valor 0 como un int tiene utilidad. No hay-por ejemplo-utilidad en una «cadena» en el C-sentido más allá de su propósito como un terminator, y como tal hemos sido bendecidos con la cadena terminada en cero que concepto. No puedo pensar en otra manera de cuantificar más allá de que (sinceramente). Y muchos, incluido yo mismo, deseamos que el tipo pascal (longitud fija) cadena habría sido adoptado en su lugar.
  • Agradezco 🙂
  • ¿Por qué todos ustedes la publicación que «matriz de caracteres que no es una cadena» como respuestas? Es absolutamente cierto, y fue escrito por Dennis Meng en el primer comentario. Pero que de ninguna manera responde a la pregunta!
  • Porque se refiere a la cuestión planteada. En mi respuesta he de aclarar que por qué \n no se utiliza para las matrices.
  • Tengo este array terminó en 0: int arr[] = {3, 4, 0}; Así que, ¿qué?
  • Por qué 4 upvotes por un mal formulada la pregunta? ¿Cuál es el punto?
  • Por convención, en C, un carácter de «cadena», termina con un «null» carácter». Esto es debido a que la longitud de la cuerda no es «descrito externamente». Cualquier matriz de todo es inútil si usted no sabe de su longitud.

12 Kommentare

  1. 23

    La pregunta contiene una suposición tácita de que todos los char matrices terminan con un carácter nulo. Este es, de hecho, no siempre es el caso: la char matrices que debe terminar con el carácter null son aquellos destinados para su uso como cadenas, que de hecho, exigir la terminación.

    En tu ejemplo, la char matriz sólo termina con un carácter nulo porque usted lo hizo. El único lugar donde el compilador inserta el carácter nulo para usted es cuando se declara una matriz de char de un literal de cadena, tales como:

    char name[] = "VIJAY";

    En ese caso, el carácter nulo se inserta automáticamente para hacer la matriz resultante una validez de C de la cadena. Ese requisito No existe para las matrices de otros tipos numéricos, ni pueden ser inicializados a partir de un literal de cadena. En otras palabras, añadiendo un cero a un array numérico serviría a ningún propósito en absoluto, porque no hay ningún código por ahí que usa el cero a buscar la matriz final, ya que el cero es perfectamente válido número.

    Matrices de punteros a veces termina con un puntero NULO, lo cual tiene sentido porque un puntero NULO no puede ser confundido con un puntero válido. El argv matriz de cadenas, recibido por main(), es un ejemplo de una matriz.

    • Sí sé que, pero mi pregunta era por Qué no se incluye a ‘\0’ en matrices numéricas ?
    • Porque no hay ninguna necesidad de ellos. Como la respuesta, dice, la \0 en la matriz de caracteres sólo sirve para hacer que la matriz sea una validez de C de la cadena. Si no hay ningún requisito para hacer una cadena (como es evidentemente el caso de nochar matrices), un punto 0 es inútil.
    • Esto no es una respuesta a la pregunta. La pregunta es exacto: Why the numeric arrays does not end with a null character?
    • A veces aparentemente exacto preguntas no son contestadas, tales como «hacer saber a tus padres que eres calvo?» (si no estás calvo). La redacción de el OP pregunta contiene una suposición tácita de que char matrices terminan con un carácter nulo, que no es necesariamente el caso. La respuesta explica esto en detalle, y si usted piensa que usted puede responder a la pregunta mejor, no dude en presentar una respuesta de su propio.
    • «no hay código de allí que utiliza el cero a buscar la matriz final», un poco de una declaración audaz que! Creo que de todo el código que hay en el mundo que es, probablemente, algunos en algún lugar que hace justamente eso.
    • Por supuesto, hay cosas salvajes por ahí 🙂 pero tenga en cuenta que yo estaba refiriendo específicamente a las matrices que contienen ceros.

  2. 5

    Un cadena termina con un 0 terminator, pero un cadena no es la misma cosa como un matriz. Utilizamos matrices para tienda cadenas, pero también podemos utilizar las matrices para almacenar las cosas que son no cadenas. Es por eso que las matrices en general no tienen automáticamente un 0 anexado.

    Además, en cualquier genérico de la matriz de int, 0 puede ser un válido (no centinela) valor.

  3. 5

    Una matriz puede terminar en cualquier cosa que es un valor válido de la matriz de tipo de elemento. Pero sólo un \0 terminado char matriz se conoce como una cadena.

    Por ejemplo

    char name[]={'V','I','J','A','Y'};

    Válida, pero no una cadena, el límite es que no se puede utilizar en funciones a la espera de una cadena como strlen etc.


    Aclarar de OP comentario más abajo, por el C estándar, cualquier personaje literales, como 'a', '1', etc, incluyendo '\0' son de tipo int. Y usted puede poner un '\0' al final de un int matriz como esta:

    int arr[] = {20, 22, 23, '\0'};

    Pero la gente no suele hacer eso, porque lo habitual es que '\0' sólo se utiliza para cadenas terminadas. El código anterior es equivalente a

    int arr[] = {20, 22, 23, 0};
    • Thankx bro 🙂 Y llegué a una conclusión a partir de ur respuesta que ¿por qué matrices numéricas no hav ‘\0’ al final.La simple razón respecto de esto es que ‘\0’ no es de tipo entero, por lo tanto no puede ser incluido en matrices numéricas 🙂
    • Sí, eso es correcto. También echa un vistazo a una amenaza en Stackoverflow:- stackoverflow.com/questions/2998983/nul-terminating-a-int-array
    • Bueno, en realidad, por el C estándar, cualquier personaje literales son de tipo int, incluyendo \0.
    • sí sé que, pero yo me pregunto por qué nose incluyen ‘\0’ en numric matrices u puede dar razón apropiada para que..alguien dijo que ‘\0’=>0 por lo tanto es inútil usar ‘\0’.Así fue que la razón apropiada para que???
    • Yo nunca uso '\0' a mí mismo. Me creció rápidamente lejos de ese hábito al trasladar el código de llena de con la mano-conjunto de terminadores de ANSI a Unicode. Cientos de archivos a nivel mundial sustitución de '\0' con L'\0' me hizo darme cuenta de la mitad del camino a través de «duh. simplemente reemplazarlo con 0 y dejar que el compilador resolver con una adecuada promoción».
    • Eso es correcto. '\0' es el mismo que 0. Y no es la única. El carácter 'A' es el mismo que el entero 65 en cualquier ASCII de la máquina. Como he dicho, es sólo convencional que '0' tiene este significado especial de la terminación de las cadenas.
    • bueno si tú lo dices..pero de nuevo surge el problema..Supongamos que hav para almacenar las marcas de 4 estudiantes en la que stud1 asegurado 10 …stud2 asegurado 20 y stud3 asegurado 0 y nos hav no entró en las marcas de stud4…por lo que si utilizamos otro 0 o ‘\0’ al final, a continuación, wat será el resultado de esa situación …aclarar mí
    • Creo que te refieres está utilizando un valor como un guardia? Que es útil en algunas situaciones y 0 es una forma común de guardia en ciertos problemas.
    • ustedes son los primeros hombres en este hilo, que por fin ha encontrado la verdadera pregunta. Ahora lee el primer post, la primera línea =)

  4. 4

    Usted puede hacer un int matriz final con 0 así, si usted desea:

    int iarray[] = {1, 2, 3, 0};

    Desde '\0' y 0 son exactamente el mismo, incluso se podría reemplazar el 0 arriba por '\0'.

    Su confusión puede ser debido a la inserción automática de '\0' en una declaración, tales como:

    char s[] = "hello";

    En lo anterior, la definición de s es equivalente a char s[] = {'h', 'e', 'l', 'l', 'o', '\0'};. Creo que de este un un atajo conveniente proporcionados por el C estándar. Si usted desea, usted puede forzar a un no-cero terminada matriz de char por ser explícito sobre el tamaño:

    char s[5] = "hello";

    En el ejemplo anterior, s no se NUL terminado.

    También tenga en cuenta que los caracteres literales en C son de tipo int, así '\0' es en realidad un int. (También, char es un tipo integral.)

    • La última muestra: también no se compilará. clang: («Inicializador de cadena para la matriz de char demasiado tiempo.»)
    • Pero es válida C. Consulte C preguntas frecuentes
    • El estándar de C, dice: «Una matriz de tipo de caracteres puede ser inicializado por una cadena de caracteres literal, opcionalmente encerrado entre llaves. Los sucesivos personajes de la cadena de caracteres literal (incluyendo el carácter nulo de terminación si hay habitaciones o si la matriz es de tamaño desconocido) inicializar los elementos de la matriz.» (el énfasis es mío).
    • mis advertencias + advertencias-como-errores de configuración. Siempre estoy compilando con ellos manivela, y este fue recogido por ellos. Me disculpo sinceramente.
    • no hay problema. Es interesante que sonar advierte acerca de este caso. Nada de lo dispuesto en la norma es dejar de tratar de ser más útil :-). He probado con gcc y con mi estándar de las advertencias del compilador habilitado ( -Wall -Wextra , además de un montón de otros), no se advierten acerca de esto.
    • Él no puede (generalmente) marca el final de int matriz con 0, porque 0, en el contexto del programa, puede ser un valor válido. Creo que eso es lo que se pregunta acerca de.
    • Es un muy mal formulada la pregunta. 0 es válido char. En un caso particular, que siendo una cadena C, 0 se utiliza como un terminador de cadena (valor de centinela). Este caso no es diferente del uso de 0 como un terminador de una int matriz si la matriz se supone que contiene sólo valores positivos. Todas las personas que respondieron a esta pregunta ya saben todos los de arriba.

  5. 2

    Usted necesidad de poner fin a las cadenas de C con '\0' ya que esta es la forma en que la biblioteca se sabe dónde los extremos de una cuerda.

    La NUL-terminación es lo que diferencia a una matriz de char a partir de una cadena (un NULterminada char-matriz). La mayoría de cadena-la manipulación de funciones se basa en NUL saber cuando la cadena está terminado (y su trabajo está hecho), y no funciona con el simple char-matriz (por ejemplo. van a seguir trabajando más allá de los límites de la matriz, y continuar hasta que se encuentra un NUL en algún lugar de la memoria – a menudo corromper la memoria como se va).

    • +1, pero el término NULL no es apropiado. Es NUL, cero o mejor 0. NULL es un puntero null constante.
    • OK. La edición de mi respuesta.
    • Esto no es una respuesta a la pregunta. Todos sabemos por qué es cero para la terminación. La pregunta es exacto: Why the **numeric** arrays does not end with a null character?
  6. 2

    Usted no tiene que tener un '\0' char en al final de la matriz de caracteres! Esta es una suposición equivocada. No hay una regla que dice que hacer. Personajes (char tipo) son exactamente igual que cualquier otro tipo de datos.

    Usted tiene que tener un terminada en null char array si deseas de impresión de la matriz utilizando el estándar printf-las funciones de la familia. Pero sólo debido a que estas funciones dependen de la final de la matriz de caracteres – '\0' char.

    Funciones a menudo tienen reglas sobre el tipo de datos que esperar. Cadena (char[]) funciones no son la excepción. Pero esto no es un requisito del idioma, es la API de que usted está usando que tiene estos requisitos.

  7. 2

    Matriz de Char termina con especial char '\0' por lo que puede ser tratada como una cadena de texto.
    Y cuando se está manipulando la cadena debe haber alguna forma de decirle a la longitud(límite) de esa cadena.

    Mirar prototipo de función de strcpy

    char * strcpy ( char * destination, const char * source );

    ¿Cómo saber copiar cuántos caracteres de origen a destino? La respuesta es que, mirando la posición de '\0‘.

    La '\0' char es importante cuando se trata de la cadena como un char *. Sin '\0' como un marcador final no han sido capaces de tratar char * como cadena.

  8. 2

    Hay tres, tal vez cuatro formas decentes de seguimiento de una matriz de longitud, sólo dos de los cuales son comunes en C:

    • Seguir la pista de la longitud de ti mismo y pasar a lo largo de con el puntero.

      Así es como normalmente, las matrices de trabajo. No requiere ningún formato especial, y hace de la sub-matriz de puntos de vista trivial para representar. (Añadir al puntero, restar de la longitud, y ahí ya va.)

      Todas las funciones de la biblioteca estándar que funciona con los no-matrices de cadena espera que esta ya. E incluso algunas de las funciones que lío con cadenas de caracteres (como strncat o fgets) hacerlo por motivos de seguridad.

    • Terminar el arreglo con algunos «centinela» del valor.

      Esta es la forma C cadenas de trabajo. Debido a que casi cada conjunto de caracteres de codificación en la existencia define '\0' como no imprimibles, «no hacer nada» carácter de control, es, por tanto, una parte típica de texto, por lo que se utiliza para terminar un cadena tiene sentido.

      Tenga en cuenta que cuando usted está utilizando un char[] como un matriz de bytes, sin embargo, usted todavía tiene que especificar una longitud. Eso es porque bytes no son personajes. Una vez que usted está tratando con bytes en lugar de caracteres, 0 pierde su significado como un centinela de valor y va a volver a ser el viejo y simple de datos.

      El gran problema es que con la mayoría de los tipos fundamentales, cada disposición posible de sizeof(type) bytes podría representar una válida, útil valor. Para valores integrales, el cero es particularmente común; es, probablemente, uno de los más usados y más números útiles en todos los de la informática. Espero ser capaz de poner un 0 en una matriz de enteros sin que aparecen para perder la mitad de mis datos.

      Entonces la pregunta es, ¿qué sería un buen valor de centinela? Lo que de otro modo-número legal debería ser prohibida en matrices? Y la pregunta que no tiene nada de bueno, una respuesta universal; depende enteramente de sus datos. Así que si usted quiere hacer una cosa, estás en tu propio.

      Además de la falta de un buen valor de centinela, este enfoque se cae con los no-tipos de caracteres por otra razón: es más complicado para representar los subconjuntos de la matriz. Para que una función recursiva para pasar parte de la matriz a sí mismo, se tendría que insertar el valor de centinela, se llama a sí mismo, y, a continuación, restaurar el valor antiguo. O eso, o podría pasar un puntero al inicio de la gama y la longitud de la gama. Pero espera…¿no es lo que usted está tratando de evitar? 😛

    Para la integridad, los otros dos métodos:

    • Crear una estructura que puede almacenar la longitud de la matriz junto con un puntero a los datos.

      Esta es una de las más enfoque orientado a objetos, y es cómo las matrices de trabajo en casi todas las lenguas modernas (y cómo vectores de trabajar en C++). Funciona bien en C fib tiene una API para administrar tales estructuras, y fib que utilice el API religiosamente. (Lenguajes orientados a objetos proporcionan una manera de fijar la API para el objeto en sí. C no, por lo que es hasta que te quedes a la API). Pero cualquier función que no fue diseñado para trabajar con su structs tendrá que pasar un puntero (y posiblemente de longitud) con uno de los dos métodos anteriores.

    • Pasar dos punteros.

      Esta es una forma común de pasar una «gama» en C++. Se pasa un puntero al inicio de la matriz, y un puntero justo después de la final. Es menos común en C, sin embargo, porque con el formato raw, punteros, (start,length) y (start,end) representar los mismos datos — y C no tiene los iteradores y plantillas que hacen que esta mucho más útil.

  9. 1

    Matrices de por sí, no tiene que ser 0\ terminado, es el uso de las matrices de caracteres en la manera específica en que los necesita para ser \0 terminado. La biblioteca estándar de funciones que actúan sobre matrices de caracteres se utiliza el \0 para detectar el final de la matriz y por lo tanto el tratamiento como una cadena, este comportamiento se refiere a los usuarios de estas funciones tendrá que seguir el \0 de terminación de la condición. Si su matriz de caracteres de uso no utilizar cualquier tipo de funcionalidad, a continuación, no necesita la \0 terminator.

    • «Matrices de por sí, no tiene que ser 0\ terminada». Y puedo decir que sería muy útil, para tener la marca en la final de la matriz. Pregunta realizada fue: ¿por qué no contamos con dicha marca.
  10. 1

    Una matriz de char no necessarilly termina con \0.

    Es una C de la convención de que las cadenas se terminó con \0.

    Esto es útil para encontrar el final de la cadena.

    Pero si usted está interesado sólo en la celebración de datos que es de tipo char, usted puede tener un \0 al final o no.

    Si su matriz de char es destinado a ser utilizado como una cadena, se debe agregar \0 al final de la misma.

    EDITAR: Lo que se terminó por \0 son los literales de cadena, no la matriz de char.

    La pregunta está mal formulada.

  11. 0

    Un ejemplo a tomar el punto de que la forma de \0 confundirá si se toma en una matriz de enteros:-

    int marks[]={20,22,23,0,93,'\0'};
                          ^  

    Así que ahora su matriz suponer que 0(marcado) es una final de la matriz que no es verdad.

    \0 es generalmente utilizado para poner fin a una cadena. En la cadena de \0 es considerado como el final de la cadena.

    En su ejemplo, usted no necesita terminar con ‘\0’

    Encontrado una muy interesante wiki post:-

    En el momento en que C (y los idiomas que se deriva) fue
    desarrollado, la memoria era muy limitado, por lo que el uso de un solo byte de
    la sobrecarga de la tienda de la longitud de una cadena era atractivo. La única
    alternativa popular en ese momento, generalmente se llama una «cadena Pascal»
    (aunque también se utiliza por las primeras versiones de BASIC), se utiliza un byte inicial para
    almacenar la longitud de la cadena. Esto permite que la cadena contiene NUL
    y de hecho la búsqueda de la longitud de sólo necesitan de un acceso a la memoria (O(1)
    (constante) tiempo). Sin embargo, C diseñador Dennis Ritchie decidió seguir
    la convención de NUL-terminación, ya establecido en BCPL, a
    evitar la limitación en la longitud de una cadena causada por la celebración de la
    cuentan en una de 8 o 9 bits de la ranura, y en parte porque mantener el recuento de
    parecía, en nuestra experiencia, menos conveniente que el uso de un terminator.

    También echa un post relacionados:- nul terminar una matriz int

    • Creo que es intencional.
    • Todos sabemos que no puede terminar con el cero. La pregunta es porque?
    • Ok, así que usted tiene votada abajo todas las respuestas aquí. De todos modos he intentado actualizar mi respuesta después de votada abajo. La esperanza de que lo hace mejor. Y usted puede quitar su downvote 🙁
    • tu post es muy interesante, pero todavía no responde a la pregunta.
    • He explicado con la ayuda de un ejemplo de lo que el OP ha preguntado. Es que mal para llegar votada abajo? 🙁
    • lo siento, veo que el ejemplo y ver que no podemos utilizar el cero-la terminación, y cómo no se pudo encontrar el final adecuado de la matriz. Pero todavía no puedo ver la respuesta a la pregunta de «¿por Qué es eso así?». Y la respuesta es muy simple, y no tiene nada con C. Sólo el sentido común.
    • No hay ningún problema. Y estoy de acuerdo en que se trata de un sentido común y nada que ver con la C. traté de responder lo mejor que pueda! 🙂
    • OP preguntó: «¿por Qué las matrices numéricas no termina con un carácter nulo ?» Y esta respuesta es uno de los dos que en realidad responde a la pregunta (el otro es el tuyo). Ejemplo únicamente muestra «¿por Qué las matrices numéricas no termina con un carácter nulo» y explica que «la razón detrás de esto». Así que no veo la razón para downvote.

  12. -3

    Tenemos una convención: carácter especial '0' con código numérico 0, marca el final de la cadena.

    Pero si quieres marcar fin de int matriz, ¿cómo se sabe es que 0 es válido miembro de la matriz o de fin de la matriz de marca? Así que, en general, no es posible contar con dicha marca.

    En otras palabras:

    El carácter '\0' (pero no de carácter '0', código 48) no tienen ningún sentido en el contexto de la cadena de texto (por convención, es un carácter especial, que marca el final), por lo que puede ser utilizado como final de la matriz de marca:

    Entero 0 o \0 (que es el mismo), se entero válido. Es puede tener sentido, y es por eso que no ser utilizado como final de la matriz de marca:

    int votesInThisThread[] = { 0, -1, 5, 0, 2, 0 }; //Zeroes here is a valid numbers of upvotes

    Si l tratar de detectar el final de este ejemplo de la matriz mediante la búsqueda 0, obtendrá tamaño de 0.

    Que es lo que pregunta acerca de?

    • 0 es un «válido» char así. Nada de lo dispuesto en el lenguaje C se me detiene de hacer char s[] = "hello\x00world"; (se Puede adivinar lo que sizeof s sería en este caso?
    • Voy a probar eso y decir de 12 caracteres. Es, después de todo, una terminada en el literal («por encima»de-terminado, sólo para ser, saber, seguro =P).
    • personajes 0 (ASCII código 48) y \0 (código 0) no son las mismas.
    • y '0' es el carácter literal para que el valor ASCII es de 48. Ya que la pregunta está hablando acerca de char matrices, y no necesariamente cadenas, '\0' puede es un carácter válido en una matriz.
    • Que es exactamente lo que yo escribí. Por CIERTO, la pregunta no es acerca de char matrices. Es acerca de porque int matrices no tiene fin-de-la matriz de la marca. Leer primer post detenidamente, encontrar signos de interrogación en ella, así que usted sabe de qué estoy hablando.
    • las matrices no tienen final de la matriz de marcar. También, '0' no es lo mismo que 0. Del mismo modo, '\0' no es lo mismo que \0. \0 no significa nada a menos que sea en las cotizaciones.
    • Supongo que te tienen a mi pregunta 🙂 Todo el mundo está diciendo a las cadenas de bla bla bla, pero que no están recibiendo lo que la pregunta en realidad significaba para ? Yo m con la esperanza de un ojo de buey respuesta .. compañero de do u hav ninguna idea sobre esto ???
    • bueno, me he explicado mis ideas en mi respuesta anterior =) lo básico es que 0 no tienen sentido en una línea de texto (que tiene un significado especial), pero puede ser un número entero válido en el contexto de la matriz int (como cualquier otro entero).
    • Especialmente en las versiones anteriores de C, a veces puede ser útil disponer de literales de cadena con la inserción de cero bytes. El string métodos no ver partes de los literales que sigue el primer byte cero, pero otros métodos que conocer el propósito de los datos a los que literal de cadena de puntos se puede utilizar toda la cosa. Como un ejemplo, si en el código se necesita para escribir la secuencia de bytes 1,2,3,0,3,2,1 podría hacer algo como write_data("\x01\x02\x03\x00\x03\x02\x01", 7);. Sería la responsabilidad de que el código que utiliza el literal de cadena para saber cuánto tiempo es, desde el byte cero no voy a decir.
    • Nuevos dialectos de C permitir «en-línea» de la matriz de declaraciones que pueden reducir la necesidad de abusar de los literales de cadena en este tipo de moda, pero en mayores C dialectos literales de cadena son el único constructo que dice «dame una referencia a una matriz constante a la celebración de determinados contenidos» que puede ser utilizado en una expresión.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea