2009-02-07 43 views
5

Para empezar, tengo cuatro semanas en un curso de C++ y aún no sé loops, así que, por favor, hablen de bebés?cifrado César en C++

Está bien, así que se supone que debo leer una cadena de doce caracteres (más NULL hace trece) de un archivo, y luego desplazar las letras hacia atrás tres, y luego imprimir mis resultados en pantalla y archivo. Estoy bien con todo, excepto con las letras cambiantes. No quiero escribir millas de código para tomar cada personaje individualmente, restar tres y volver a montar la cadena, pero no estoy seguro de cómo trabajar con toda la cadena a la vez. ¿Alguien puede recomendar un método realmente simple de hacer esto?

+0

Por "Yo ni siquiera sé bucles todavía" ¿significa eso que todavía no puedes usarlos? –

+0

¿Quiere decir cambiar las letras como en reposicionarlas en la cadena o usar caracteres anteriores del alfabeto. –

+0

Amanda: Marque una respuesta como aceptada. Hay varias buenas respuestas para elegir. – abelenky

Respuesta

1

Itere los caracteres con un bucle for. Y haz lo que quieras con el char *. Luego devuelve el nuevo char.

1
for(int i=0; i<12; i++){ 
    string[i] = string[i] - 3; 
} 

Donde string es su matriz de caracteres (cadena). Hay un poco más de implicación si desea hacerlo periódico (I.E. tiene un ajuste redondo a Z, pero el código anterior debería ayudarlo a comenzar)

2

Vas a tener que aprender bucles. Le permitirán repetir algún código sobre los caracteres de una cadena, que es exactamente lo que necesita aquí. Mantendrá una variable entera que será su índice en la cadena, y dentro del ciclo haga su cambio de letra en el carácter en ese índice e incremente la variable de índice en uno hasta llegar a NULL.

Editar: Si no se espera que saber acerca de los bucles sin embargo, en su curso, tal vez quieren que hagas esto:

string[0] -= 3; // this is short for "string[0] = string[0] - 3;" 
string[1] -= 3; 
string[2] -= 3; 
... 

Es sólo resultará en 12 líneas de código en lugar de millas . No tiene que "volver a montar" la cadena de esta manera, solo puede editar cada carácter en el lugar. Entonces apuesto a que después de obligarlo a hacer eso, le mostrarán la forma más rápida de hacerlo utilizando bucles.

1

No estoy un poco claro a qué te refieres con "cambiar las letras hacia atrás 3"? ¿Eso significa D ==> A?
Si es así, aquí hay un bucle simple.

(que no lo hice leer desde el archivo o escribir en el archivo ... eso su parte)

#include <string.h> 

int main(void) 
{      
    char input[13] = "ABCDEFGHIJKL"; 
    int i; 

    int len = strlen(input); 

    for(i=0; i<len; ++i) 
    { 
     input[i] = input[i]-3; 
    } 

    printf("%s", input); // OUTPUT is: ">[email protected]" 
} 
+0

WTF es el voto abajo? Creo que mi respuesta es bastante clara y directa. – abelenky

+0

No te recriminé, pero supongo que es porque proporcionaste el código en lugar de explicar * cómo * resolver el problema, que no es tan beneficioso para alguien que recién comienza a aprender. – Chuck

6

Si se trata de simples letras (A a Z o A a Z) , entonces puede suponer que los códigos internos son lineales.

cartas se codifican como números, entre 0 y 127. A se codifica como 65, B como 66, C como 67, Z como 90.

Con el fin de cambiar cartas, sólo hay que cambiar el interno código de la letra como si fuera un número, básicamente basta con restar 3 del personaje. Sin embargo, tenga cuidado con los casos extremos, porque restar 3 a 'A' le dará '>' (código 62) y no 'X' (código 88). Puede manejarlos usando instrucciones "if" o el operador de módulo ("%").

Aquí es un ASCII characters table para ayudarle a

5

Una vez que haya cargado la cadena, puede utilizar el operador modulous para girar mientras se mantiene dentro de los límites de un espacio-Z.

Me seguimiento de si la carta era un capital para comenzar con:

bool isCaps = (letter >= 'A') && (letter <= 'Z'); 
if(isCaps) 
    letter -= 'A'-'a'; 

y luego simplemente hacer el cambio de cifrado como esto:

int shift = -3; 
letter -= 'a'; // to make it a number from 0-25 
letter = (letter + shift + 26) % 26; 
     // add 26 in case the shift is negative 
letter += 'a'; // back to ascii code 

finalmente terminar con

if(isCaps) 
    letter += 'A'-'a'; 

así que, juntando todo esto obtenemos:

char *mystring; // ciphertext 
int shift = -3; // ciphershift 

for(char *letter = mystring; letter; ++letter) 
{ 
    bool isCaps = (*letter >= 'A') && (*letter <= 'Z'); 
    if(isCaps) 
    *letter -= 'A'-'a'; 

    letter -= 'a'; 
    letter = (letter + shift + 26) % 26; 
    letter += 'a'; 

    if(isCaps) 
    letter += 'A'-'a'; 
}