Motivo de una salida tan inusual en c ++
Frecuentes
Visto 115 veces
1
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;
}
5 Respuestas
6
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
3
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
1
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
1
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
0
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 c++ printf or haz tu propia pregunta.
Dio la casualidad de que para usted, la matriz que contiene
{'m', 'o', 'n', 'u'}
estaba en la memoria antessonuka
(que termina con un\0
y termina una cadena). Utilizando el%s
el modificador haráprintf
lea hasta que encuentre el terminador nulo (quename1
no tiene ya que no es una cadena de estilo C. - 逆さま5 respuestas en 4 segundos... eso va a ser un récord. - Luchian Grigore
@LuchianGrigore ¿dónde está el tuyo? :) - ouah