Se supone que debo responder una pregunta de tarea para una de mis clases. Específicamente, se supone que debo decir si ciertas matrices en C se consideran cadenas o no. Basado en este artículo ( https://www.geeksforgeeks.org/strings-in-c-2/ ) Sé que las cadenas son una serie de caracteres con el terminador nulo al final.
Mi bloqueo principal es una parte de la pregunta que se hace sobre una matriz que se ve así:
char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };
Obviamente, se trata de una serie de caracteres con un carácter de terminación nulo al final. Sin embargo, ¿todavía se considera una cadena ya que también tiene un carácter de terminación nulo en el medio? ¿Cómo afectará eso a la cuerda?
EDITAR: Basado en comentarios, he proporcionado la redacción real de la pregunta:
"¿Cuál de las siguientes matrices puede considerarse" cadenas "con el propósito de usarlas como argumentos para strcpy (), strncpy (), strcmp (), strncmp () y funciones de cadena similares (indicar todas las aplicaciones)?
EDITAR: envié un correo electrónico a mi profesor al respecto ya que la pregunta parecía ambiguamente redactada (como señalaron varias personas). Si alguien tiene curiosidad, me dijo "Sí, es una cadena. La clave es que hay un carácter nulo. Pero, por supuesto, eso afectará cualquier operación de cadena; la cadena termina en el carácter nulo".
fuente
"CS"
con algunos bytes de basura añadidos (en cuyo caso el carácter NUL final es irrelevante). Pero no es una cadena "en su conjunto". - Sin embargo, alimentar esto astrcpy
etc. no hará que su PC explote porque estas funciones "verán" solo la"CS"
parte.strcmp()
. Si se puede usar como argumento para mutar funciones de cadena depende de factores adicionales que no se proporcionan.c1
es mutable, por lo que no veo por qué no podría ser un argumento de destino válidostrcpy
o similar, a menos que no sea lo suficientemente grande como para acomodar la cadena de origen. Eso no haría que no sea una cadena, simplemente no una adecuada para un propósito determinado.c1
satisfaría los requisitos básicos para los argumentos de cadena para todas las funciones de cadena (estrechas) de la biblioteca estándar, incluidas todas aquellas específicamente nombradas, pero el comportamiento podría no ser lo que la persona que llama espera o desea (incluso ignorando los comportamientos indefinidos que podrían surgir).char
. Cualquier tipo de personaje servirá.Respuestas:
c1
es en su mayoría [1] a equivalente&c1[0]
, que es la celebración de una cadena,"CS"
.Hay una segunda cadena al acecho allí,
"324"
a partir de las&c1[3]
- pero siempre y cuando se accedec1
comoc1
, la cadena"CS"
es todas las funcionesstrcpy()
et al. vería.[1]:
c1
es una matriz,&c1[0]
es un puntero.fuente
c1
como cadena de destino en unstrcpy()
comando? La pregunta es ambigua, en el mejor de los casos.c1
como argumento parastrcpy()
. Es una cuerda perfectamente ordinaria en todos los sentidos. Las cadenas ordinarias a menudo contienen restos de basura después de sus terminadores. El hecho de que esta basura esté codificada en el programa da la impresión de que el autor tiene la intención de usarlac1
de forma no encadenada, pero eso no era parte de la pregunta.c1
es equivalente a&c1[0]
" engaños.c1
es una matriz&c1[0]
Es un puntero.Si desea conocer los detalles de la definición de una cadena en C, vaya a la fuente.
Del estándar C90 :
(No hubo cambios relevantes en los estándares posteriores).
Por lo tanto,
c1
contiene dos cadenas consecutivas, "CS" y "324", pero no es en sí misma una cadena.Si pasamos una matriz a una función, se desintegra a un puntero a su primer elemento, por lo tanto,
+c1
apunta a una cadena (la primera), que es lo suficientemente buena para cualquier función que espera un puntero a cadena. No apunta a una cadena "CS \ 0324", pero probablemente sea lo suficientemente buena para la pregunta de su instructor, que es ambigua.fuente
+c1
apunta a una cadena, porquec1
comienza con una cadena. Sin embargo, eso de ninguna manera, forma o forma hacec1
una cadena.Agregando a la respuesta de @ DevSolar, algo que descubrí después de jugar con la cadena dada, si fuera:
Si saca esta cadena, obtendrá
CS03240
y el tamaño de esta cadena es 7. En lo que a mi entender se refiere,\\0
se usa para denotar el carácter nulo ( es decir\0
). Si lo haces:No ve nada en el registro de salida, pero si lo hace:
Verá un
\0
, algo que se espera porque para generar caracteres especiales como barras invertidas o comillas, debe usar un\
junto con ellos.Algo que me desconcierta es la salida
CS03240
y su tamaño 7. Es de conocimiento común que el tamaño de una cadena es el número de caracteres que contiene más uno (para el carácter nulo). Además, el tamaño es de 7 incluso para la cadena,char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };
.Entonces, tal vez un seguimiento de esta pregunta, ¿qué está pasando aquí?
fuente
'\\0'
No es un personaje nulo . Es una constante de múltiples caracteres. Tiene un valor definido de implementación ciertamente fuera del rango dechar
.c1[]
no es una cadena ya que carece de un carácter nulo . "la salida de esta cadena" probablemente da como resultado un comportamiento indefinido .char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };
es de tamaño 7 porque se inicializa con 7 valores. Su tamaño no tiene nada que ver con las cuerdas .char c1[] = { 1, 2, 3, 4, 5, 6, 7 };
todavía lo haría tamaño 7.c1
contiene una picadura? Esa es una cuestión aparte. Ver también