que etiquetas etiqueta ejemplos desventajas cuerpo cafe beneficios c console terminal reset

c - desventajas - etiquetas html ejemplos



¿Por qué sucede esto(ver imagen)? (7)

Además de lo que dijeron los demás respecto a ignorar el carácter del terminal de cadena y simplemente imprimir lo que hay en la memoria después de la cadena, el motivo por el que el símbolo del sistema también es "basura" es imprimir un carácter "no imprimible" en particular , tu sesión de terminal quedó en un modo de personaje extraño. (No sé qué personaje es o qué cambio de modo hace, pero tal vez alguien más pueda hablar sobre eso que sabe mejor que yo).

¿Por qué tiene el siguiente efecto: imprime un terminal lleno de caracteres aleatorios y luego sale dejando un símbolo del sistema que produce basura cuando lo ingresa. (Lo probé porque pensé que produciría una falla seg).

#include <stdio.h> int main(){ char* s = "lololololololol"; while(1){ printf("%c", *s); s++; } }

fue compilado con:

gcc -std=c99 hello.c


Ampliando ligeramente las respuestas dadas aquí (que son todas excelentes) ... Me encontré con esto más de una vez cuando estaba empezando con C, y es un error fácil de hacer.

Un ajuste rápido a su ciclo while lo arreglará. Todos los demás te han dado el por qué, te conectaré con el cómo:

#include <stdio.h> int main() { char *s = "lolololololololol"; while (*s != ''/0'') { printf("%c", *s); s++; } }

Tenga en cuenta que en lugar de un bucle infinito ( while(1) ), estamos haciendo una verificación de bucle para asegurarnos de que el puntero que estamos sacando no es el terminador nulo para la cadena, evitando así el rebasamiento que está encontrando.

Si está atrapado absolutamente necesitando while(1) (por ejemplo, si esto es tarea y el instructor quiere que lo use), use la palabra clave break para salir del ciclo. El siguiente código huele, al menos para mí, pero funciona:

#include <stdio.h> int main() { char *s = "lolololololololol"; while (1) { if (*s == ''/0'') break; printf("%c", *s); s++; } }

Ambos producen la misma salida de consola, sin salto de línea al final:

lolololololololol


Eventualmente cortará la falla, pero antes imprimirá los bytes que estén en la misma página. Es por eso que ves caracteres aleatorios en la pantalla.

Esos pueden incluir secuencias de escape para cambiar (digamos) la codificación de caracteres de la consola. Es por eso que terminas con un galimatías cuando escribes en la consola después de que también sale.


Porque tiene un bucle infinito ( while(1) ), y sigue obteniendo el valor actual de puntero ( *s ), y luego mueve el puntero un char hacia adelante ( s++ ). Esto tiene el efecto de avanzar mucho más allá del final de la cadena en "basura" (memoria no inicializada), que se imprime en la consola como resultado.


Simplemente está imprimiendo lo que está en la memoria porque su ciclo no se detiene al final de la cadena. Cada byte aleatorio se interpreta como un personaje. Segmentará la falla cuando llegue al final de la página de memoria (y entre en un territorio ilegible).


Su bucle no termina, por lo que println imprime todo lo que está en la memoria después del texto que escribe; eventualmente accederá a la memoria que no está permitida para leer, causando que falle por segmentación.

Puede cambiar el bucle como sugirieron los otros, o puede aprovechar el hecho de que en c, cero es falso y nulo (que termina todas las cadenas) también es cero, por lo que puede construir el bucle como:

while (*s) {

Más bien que:

while (*s != ''/0'')

El primero puede ser más difícil de entender, pero tiene la ventaja de la brevedad, por lo que a menudo se usa para ahorrar un poco de tipeo.


Además, por lo general, puede regresar al símbolo del sistema usando el comando ''reiniciar'', escribiendo a ciegas, por supuesto. (escriba Enter, reset, enter)