Skip to content

Instantly share code, notes, and snippets.

@Edmartt
Last active August 23, 2020 01:56
Show Gist options
  • Save Edmartt/c179b8e81ed18a8d455e1705e4baa175 to your computer and use it in GitHub Desktop.
Save Edmartt/c179b8e81ed18a8d455e1705e4baa175 to your computer and use it in GitHub Desktop.
Cifrado de César sin caracteres extraños.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 100;
void cifrar(char*,int);
void mostrarMenu();
int main(int argc, char **argv)
{
int offset=0;
char word[500];
char* ptrword=NULL;
printf("Ingrese la palabra a cifrar: ");
scanf("%s500",word);
ptrword=malloc(strlen(word));
if(ptrword!=NULL) {
strcpy(ptrword,word);
printf("\nIngrese el desplazamiento de caracteres: ");
scanf("%d",&offset);
cifrar(ptrword,offset);
free(ptrword);
} else {
printf("\nNo hay suficiente memoria\n");
free(ptrword);
return -1;
}
printf("\n");
return 0;
}
void cifrar(char* cadena,int offset)
{
int dif,car;
int len=strlen(cadena);
int asciiMay=65,asciiMin=97;
for(int i=0; i<len; i++) {
if(cadena[i]+offset>90 && cadena[i]<=96) {
dif=90-cadena[i];
car=offset-dif;
cadena[i]=asciiMay+car-1;
} else if(cadena[i]+offset <=90) {
cadena[i]=cadena[i]+offset;
} else if(cadena[i]+offset>122) {
dif=122-cadena[i];
car=offset-dif;
cadena[i]=asciiMin+car-1;
} else if(cadena[i]<=122) {
cadena[i]=cadena[i]+offset;
}
printf("%c ",cadena[i]);
}
@Edmartt
Copy link
Author

Edmartt commented Aug 22, 2020

Aunque no entiendo lo del caracter nulo, es decir, sé lo que es, pero, ¿por qué pondría 499 en lugar de 500 si al final el caracter nulo?

Muy buena pregunta.

Te hice este programa para que veas el problema:

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

int main(int argc, char **argv)
{
  char s[4];
  char b = 2;
  scanf("%4s",s);
  printf("%s %d \n", s, b);
}

compilalo sin optimizaciones usando gcc -O0 a.c y correlo usando echo "1234" | ./a.out

Tal vez esperarías que imprimiera 1234 2, pero en mi computadora imprime 1234 0

¿Puedes ver el problema?

A scanf le decimos que lea a lo mucho 4 caracteres. Lee "1234" y los escribe en s. Pero todos los strings necesitan terminar en un caracter nulo, que es lo mismo al valor 0.

Pero scanf ya no tiene espacio para escribir el caracter nulo en s. Entonces acaba sobre-escribiendo la sienguiente posición en memoria!

b ahora vale 0 cuando lo imprimimos.

Creo que he entendido, aunque no estaba seguro.

Es decir, mi array tendría declarado 500 bytes, pero al leer la entrada es donde debo decirle que solo lo haga con 499. Esa es la parte que me confundía, estaba relacionando declararlo de ese tamaño con leerlo de ese tamaño. Bien aclaratorio, en caso de no estar yo entendiendo mal, claro está.

@MrDave1999
Copy link

Así es. En el primer parámetro debes agregarle si o si, el 499, para dejar espacio para el caracter nulo :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment