Motivo de una salida tan inusual en c ++

No puedo entender el comportamiento inusual de esta salida de código. Imprime:

 hellooo
monusonuka

El código está aquí:

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
printf(" hellooo \n");
char name[7]="sonuka";
char name1[4]={'m','o','n','u'};
printf("%s",name1);
system("pause");
return 0;
}

preguntado el 24 de agosto de 12 a las 20:08

Dio la casualidad de que para usted, la matriz que contiene {'m', 'o', 'n', 'u'} estaba en la memoria antes sonuka (que termina con un \0 y termina una cadena). Utilizando el %s el modificador hará printf lea hasta que encuentre el terminador nulo (que name1 no tiene ya que no es una cadena de estilo C. -

5 respuestas en 4 segundos... eso va a ser un récord. -

@LuchianGrigore ¿dónde está el tuyo? :) -

5 Respuestas

Su name1 matriz no termina con un carácter cero ('\0'). La printf La función imprime caracteres hasta que encuentra un cero. En su caso, va más allá del final de la matriz. Lo que sucede es comportamiento indefinido. Un resultado probable es que otras variables o basura se impriman en la pantalla hasta que finalmente \0 se golpea en otro lugar de la memoria, pero podría pasar cualquier cosa, incluido el bloqueo del programa.

Respondido 24 ago 12, 21:08

name1 debe: ser NULL-terminado, de lo contrario printf imprimirá tantos bytes, como encuentre, hasta pulsar el botón \0.

Debe ser

char name1[5]={'m','o','n','u', '\0'};

Lo que tienes es comportamiento indefinido : printf imprime la memoria después de la memoria, asignada para name1.

En este caso, parece que su compilador ha colocado la memoria para name después de name1, por eso ambos están impresos (name es correctamente NULL-terminado, como lo son todos los literales).

Respondido 24 ago 12, 20:08

name1 no tiene terminación nula, por lo que printf sigue imprimiendo caracteres hasta que \0 y sea alcanzado.

Respondido 24 ago 12, 20:08

 printf("%s",name1);

s El especificador de conversión requiere que el argumento sea un puntero a una cadena C.

char name1[4]={'m','o','n','u'}; 

no es una cadena C porque la matriz no termina en nulo. La violación del requisito de especificación de conversión invoca un comportamiento indefinido y es por eso que obtiene este resultado inesperado.

Respondido 24 ago 12, 20:08

Está intentando imprimir una matriz de caracteres como una cadena con printf. Prueba este código:

int pointer=0;
while(pointer < 4){
     printf("%c",name1[pointer]);
     pointer++;
}

Respondido 24 ago 12, 20:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.