2012-05-01 8 views
19
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char greeting[]="\nHello World!\n"; 
    int a; 

    for(int i=0; i<strlen(greeting); i++) 
     greeting[i]^=111; 

    for(int i=0; i<strlen(greeting); i++) 
     greeting[i]^=111; 

    printf("%s\n",greeting);  
    scanf("%d",&a); 

} 

Salida:XORing "¡Hola, mundo!" corta la cadena de

Hell 

¿Por qué se cortó todo después de ver una letra que corresponde al número de la clave XOR (en este caso, ASCII 'w')? En lógica matemática, N^N=0 y 0^N=N, ¿no?

+1

[** ** DEMO] (http://ideone.com/u6ZNf) – qwertymk

+0

Esto se supone que es el cifrado XOR simple, ¿verdad? – Linuxios

+0

No es una tarea, creo que es solo un ejercicio bueno y conciso para la perceptividad. Soy el autor de esta pregunta =) – 0x6B6F77616C74

Respuesta

56

Porque 'o' es código ASCII 111 y XORing 111 con 111 produce 0, NUL, y termina la cadena. Una vez que esto ocurre (incluso en el primer bucle, ya que lo está evaluando cada vez que pasa el bucle), strlen informa que la secuencia es mucho más corta y los bucles se detienen.

Guardar la longitud de la cadena antes de pasar por los XORs lo salvará de esto.

+6

Tenga en cuenta que para solucionar esto, debe guardar el valor de retorno de 'strlen' antes de que mute la cadena. –

+3

@NicolBolas Él lo muta y luego lo muda y después de eso se obtiene el hilo original, así que prueba: http://ideone.com/omgw0 –

+3

+1. Tenga en cuenta que la función de xoring también afecta al primer ciclo, no va después de la 'o'. – asaelr

10

Esto se debe a que cuando xor un número consigo mismo, se convierte en cero, y cuando strlen ve cero, cree que es el final de la cadena.

Si almacena la longitud en una variable antes del primer ciclo y luego usa esa longitud guardada en su segundo ciclo en lugar de strlen, su programa producirá el resultado esperado.

4

greeting[5] es 'o' que es 111 en ASCII. Por lo tanto, el saludo [5]^111 será cero (lo que terminará su cadena) El strlen en el segundo ciclo devolverá un valor diferente.

Para arreglar esto, use una len variable para almacenar el strlen original. ¡Recuperará su cuerda!

modificación:

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

int main() 
{ 
    char greeting[]="\nHello World!\n"; 
    int a; 
    int len = strlen(greeting); 

    for(int i=0; i<len; i++) 
     greeting[i]^=111; 

    for(int i=0; i<len; i++) 
     greeting[i]^=111; 

    printf("%s\n",greeting);  
    scanf("%d",&a); 

} 
Cuestiones relacionadas