Etiquetas

C (31) Cpp (28) Linux (14) asm (8) Telegram (5) bot (5) libreria (5) Algoritmo (3) Errores comunes (3) python (3) Opengl (2) kali (2) Android (1) Snippet (1) nano (1) recursividad (1)

miércoles, 24 de enero de 2024

Ahorcado

/*Codigo posteado por satu en elhacker.net thread: fgets para enteros?*/

#include <stdio.h>
#include <string.h>

int main (){
char palabra [7]; char final [7];char car;
int cont;
memset (&final, '-', 6);final [6] = '\0';
printf ("Escribe una palabra (lenght <7 chars): ");
fgets (palabra, 7, stdin);palabra [6] = '\0';

while (strcmp (palabra, final) != 0){
while(getchar() != '\n')
printf ("\nEscribe una letra: ");
car = fgetc (stdin);

for (cont=0; cont<6; cont++)
if (car == palabra [cont])
final [cont] = car;printf ("%s\n", final);car = 0;}

printf ("Well done! ;)\n\n");
while(getchar() != '\n') getchar();
    return 0;
}

sábado, 6 de enero de 2024

Cambiar Zona Horaria

Intro
Respaldar
/etc/localtime
/usr/share/zoneinfo
Lo ideal seria usar systemdatectl o date pero en caso de que no puedas como en kali o simplemente no quieras se puede hacer manualmente

Respaldo Primero hay que ir como root a /etc/localtime/ y usar
cp localtime ~localtime
para crear un archivo ~localtime en caso de que falle.

/etc/localtime/ La zona horaria que usa nuestro linux se encuentra en /etc/localtime/ (en etc esta toda configuracion)

/usr/share/zoneinfo Nuestra Zona Horaria se encuentra en /usr/share/zoneinfo ,debemos ir a ella por consola como root y luego copiarla en vez de /etc/localtime (nuestra zona horaria), basta con usar:
cd /usr/share/zoneinfo ;cp zonahoraria localtime /etc/localtime

luego de esto aplicar reboot
sudo reboot

Nuestra hora puede ser colocada dentro del $PS1.
Espero les haya servido ¡Hasta la proxima!.

martes, 26 de diciembre de 2023

No se puede usar apt-get update

 /* Si les sale un mensaje como el siguiente en linux*/

W: Failed to fetch https://http.kali.org/kali/dists/kali-rolling/InRelease  Temporary failure resolving 'http.kali.org'

Hay que modificar /etc/resolv.conf y poner nameserver 8.8.8.8 agregandolo al final del archivo

jueves, 21 de diciembre de 2023

Hay que evitar el uso de scanf()


/*Este texto no es de mi autoria*/

Hola Gente!!

BUENO ESTO ES UNA EXPLICACIÓN DE PORQUE AVECES EL SCANF SE COMPORTA DE MANERA EXTRAÑA. ESPERO QUE SE ENTIENDA,

voy explico porque el uso de scanf no es recomendable..
para empezar es un error decir que un programa lee del teclado en verdad lo que hace es leer de un area de memoria llamado "buffer de teclado" (no siempre es así, esto se puede manipular mediante la función  setvbuf y el modo _IOFBF, que especifica que lea hasta que el buffer esté lleno.) y el buffer del teclado es "buffer de linea" esto quiere decir que los datos que provienen del teclado se insertan linea por linea y no caracter a caracter . Es por eso que cuando leemos de ahí, por más que ingresemos muchos caracteres, hasta que no ingresamos el fin de línea (enter) el programa no lee nada y se queda trabado esperando que haya algo en el buffer.

si el buffer no está vacío, sí o sí hay al menos un fin de línea;
el buffer siempre tiene un carácter de fin de línea al final.

El gran problema con scanf es que no siempre leerá el fin de linea lo que nos lleva a que el buffer quede con basura, osea con caracteres no leídos los cuales la próxima vez que invoquemos a scanf los leerá e intentara limpiar el buffer ocasionando un salto de linea e impediendonos ingresar el dato requerido.  de mas esta decir que esto podría causar algunos problemas al programador.
scanf solo lee hasta que encuentre el formato que le especificamos, esto conlleva a otro gran problema ya que si nosotros le decimos que lea un entero (%i") y se le ingresan 2 enteros separados por un espacio scanf solo leerá hasta encontrar el formato especificado dejando al buffer sucio con ese entero de mas.
Otro problema que tenemos es que no hace casi ningún tipo de chequeo a la hora de verificar los datos ingresados si se le indica que se ingresara un entero y el usuario ingresa una letra esté hace una conversión a entero lo cual genera un problema.

en el siguiente segmento de programa intenten lo siguiente cuando les piede ingresar los datos pongan algo así como "50 10" (sin las comillas) y veran como el buffer quedara  sucio  con con el entero 10 entonces cuando se llama de nuevo a scanf "asimila" que 10 es lo que se ingreso y por eso no nos deja ingresar el dato e imprime el nuevo valor de i

#include <stdio.h>

int main(){
int i=0;
//pongan algo como 50 10
scanf("%d",&i); printf("%d\n",i);
scanf("%d",&i); printf("%d\n");//este numero sera 10 sin preguntar
return 0;}
scanf("%d",&i);printf("%d\n);


Siempre se puede usar

setbuf(stdin,NULL);

Aunque se recomienda usar fgets y sscanf:

fgets(buffer o variable donde se guarda,cantidad de caracteres,stdin); 

stdin significa entrada por teclado.buffer es un campo para reservar temporalmente algo, como puede ser una cadena.

fgets(buffer, 11,stdin); y fgets leera 11-1 caracteres siendo mas seguro que scanf. Scanf no comprueba lo que se ingresa, lo cual le hace vulnerable al buffer overflow. Se puede cambiar 11 por sizeof(buffer). 

De igual manera hay que ser cauteloso con strcat y strcopy,debe usarse strncat y strncpy con el 3er parametro que controla el ingreso de caracteres.

//con sscanf introducimos lo que tenemos en el buffer tanto en nombre como en edad    

PARA LEER ENTERO

#include <stdio.h>
#include <string.h>
int main(){
char buffer[13]={0};short int edad=0;
setbuf(stdin,NULL);
printf("Ingrese un numero: \n");
fgets(buffer,sizeof(buffer),stdin);
sscanf(buffer , %u", &edad );
printf("El numero es: %d\n",edad);
return 0;}

sábado, 16 de diciembre de 2023

Estructura con Switch

#include <stdio.h>     
struct Ficha {   
char Nombre[80];
int  Num_unidades;  
int Precio_unidad;  
int Estado;  // 0 = moroso; 1 = atrasado; 2 = pagado };     

typedef struct Ficha Fichas;     

int main(int argc, char** argv) { 
Fichas Cliente[100]; 
int i; 
char nombre[80];

for (i = 0; i < 99; i++)  {
if (nombre == Cliente[i].Nombre) {
printf ("%s", Cliente[i].Nombre);   
printf ("%i",Cliente[i].Num_unidades);   
printf ("%i", Cliente[i].Precio_unidad);   

 switch  (Cliente[i].Estado)     {    
case 0 : printf ("Moroso");         break;    
case 1 : printf ("Atrasado");         break;
case 2 : printf ("Pagado");         break;    };     
  }   }      return 0; } 

copiar matriz a otra(sin resolver)

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

void gen_matriz (int** nuevo, int matriz[20] [20]){
int j, k, y;int dup;int num_elem[20];
nuevo = (int**) calloc(20, sizeof(int*));

for (y = 0; y < 20; y++){
num_elem[y] = 0;

for (k = 0; k < 20; k++){
dup = 0;j = 0;

while ((j < 20) && !dup){
if (k != j){
dup = matriz[y][k] == matriz[y][j];
printf ("y=%i %i %i\n",y, j, dup);}
j++;}

printf ("dup %i\n", dup);

if (!dup){
num_elem[y]++;
if (nuevo[y] == NULL) nuevo[y] = (int*) malloc(sizeof (int));
else
nuevo[y] = (int*) realloc(nuevo[y], num_elem[y] * sizeof (int));
int indice = num_elem[y] - 1;
nuevo[y][indice] = matriz[y][k];
printf (" posicion %i %i : %i\n", y, k, nuevo [y] [indice]);}
                }

        }

for(y = 0; y < 20; y++)
for(k = 0; k < num_elem[y]; k++)
printf("nuevo[%i][%i] = %i\n", y, k, nuevo[y][k]);
}

Tres en raya

 #include <stdio.h> int main(){ char c1,c2,c3,c4,c5,c6,c7,c8,c9,movimiento,marcajugador; char jugar_otra; int turno_jugador; c1='1';c2='2';c3='3';c4='4';c5='5';c6='6';c7='7';c8='8';c9='9'; turno_jugador=1; bool juegoterminado(true),juego_ganado(true),movalido; do{ printf("\t\t\t\t||%c||%c||%c||\n",c1,c2,c3); printf("\t\t\t\t||+||+||+||\n"); printf("\t\t\t\t||%c||%c||%c||\n",c4,c5,c6); printf("\t\t\t\t||+||+||+||\n"); printf("\t\t\t\t||%c||%c||%c||\n",c7,c8,c9); printf("\t\t\t\t||+||+||+||\n\n");  if(turno_jugador==1)//Marca Jugador {marcajugador= 'X';} else{marcajugador= 'O';} printf("Jugador: %d Movimiento: ",turno_jugador);  do{ scanf("%c",&movimiento); movalido=true; //Checar movimientos if (movimiento == '1' && c1 == '1') {c1 = marcajugador;} 

else if (movimiento == '2' && c2 == '2'){c2 = marcajugador;} else if (movimiento == '3' && c3 == '3'){c3 = marcajugador;} else if (movimiento == '4' && c4 == '4'){c4 = marcajugador;} else if (movimiento == '5' && c5 == '5'){c5 = marcajugador;} else if (movimiento == '6' && c6 == '6'){c6 = marcajugador;} else if (movimiento == '7' && c7 == '7'){c7 = marcajugador;} else if (movimiento == '8' && c8 == '8'){c8 = marcajugador;} else if (movimiento == '9' && c9 == '9'){c9 = marcajugador;} else {printf("Movimiento Invalido, Intenta Otra Vez\n");} movalido = false;}while(!movalido);  juegoterminado=false; juego_ganado=true;  if (c1 != '1') { if (c2 == c1 && c3 == c1){juegoterminado = true;} if (c4 == c1 && c7 == c1) {juegoterminado = true;}}  if (c5 != '5'){ if (c1 == c5 && c9 == 5) {juegoterminado = true;} if (c2 == c5 && c8 == c5) {juegoterminado = true;} if (c4 == c5 && c6 == c5) {juegoterminado = true;} if (c3 == c5 && c7 == c5){juegoterminado = true;}}  if (c9 != '9') { if (c3 == c9 && c6 == c9){juegoterminado = true;} if (c7 == c9 && c8 == c9){juegoterminado = true;}}  if (c1 != '1' && c2 != '2' && c3 != '3' && c4 != '4' && c5 != '5' && c6 != '6' && c7 != '7' && c8 != '8' && c9 != '9' && !juegoterminado){ juegoterminado = true; juego_ganado = false;}  if (juegoterminado){ if (juego_ganado) {printf("Juagador: %d Gana!",turno_jugador);}                         // Imprimir Tablero printf("\t\t\t\t||%c||%c||%c||\n",c1,c2,c3); printf("\t\t\t\t||+||+||+||\n"); printf("\t\t\t\t||%c||%c||%c||\n",c4,c5,c6); printf("\t\t\t\t||+||+||+||\n"); printf("\t\t\t\t||%c||%c||%c||\n",c7,c8,c9); printf("\t\t\t\t||+||+||+||\n\n"); printf("Juego Terminado!"); printf("Jugar De Nuevo (Y/N)?"); scanf("%d",&jugar_otra);  if (jugar_otra == 'y'||jugar_otra == 'Y'){ juegoterminado = false; c1='1';c2='2';c3='3';c4='4';c5='5';c6='6';c7='7';c8='8';c9='9'; } turno_jugador=1;                 } else { if (turno_jugador == 1){turno_jugador = 2;} else {turno_jugador = 1;}                           }         } while (!juegoterminado); }