2012-05-01 14 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); 

} 

uscita:XORing "Hello World!" taglia fuori stringa

Hell 

Perché lo fa tagliare tutto ciò dopo aver individuato una lettera corrispondente al numero della chiave XOR (in questo caso, ASCII 'w')? In logica matematica, N^N=0 e 0^N=N, non è vero?

+1

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

+0

Questo dovrebbe essere semplice crittografia XOR, giusto? – Linuxios

+0

Non è un compito a casa, penso che sia solo un esercizio buono e conciso per la percettività. Sono l'autore di questa domanda =) – 0x6B6F77616C74

risposta

56

Perché 'o' è il codice ASCII 111 e XORing 111 con 111 restituisce 0, NUL e termina la stringa. Una volta che questo accade (anche nel primo ciclo, dal momento che lo stai valutando ogni volta attraverso il ciclo), strlen segnala che la stringa è molto più corta e che i loop si fermano.

Il salvataggio della lunghezza della stringa prima di passare attraverso gli XOR vi salverà da questo.

+6

Nota che per risolvere questo problema, dovrebbe salvare il valore di ritorno di 'strlen' prima che muti la stringa. –

+3

@NicolBolas Lo muta e quindi lo disimpegna e dopo viene ottenuta la stringa originale, quindi prova: http://ideone.com/omgw0 –

+3

+1. Notare che l'xoring influenza anche il primo ciclo - non va oltre la "o". – asaelr

10

Questo perché quando si xor un numero con se stesso, diventa zero e quando strlen vede zero, pensa che sia la fine della stringa.

Se si memorizza la lunghezza in una variabile prima del primo ciclo e quindi si utilizza quella lunghezza salvata nel secondo ciclo anziché in strlen, il programma produrrà il risultato previsto.

4

greeting[5] è "o" che è 111 in ASCII. Quindi il saluto [5]^111 sarà zero (che terminerà la stringa) Lo strlen nel secondo ciclo restituirà un valore diverso.

Per risolvere questo problema, utilizzare una variabile len per memorizzare la stringa originale. Riceverete la vostra corda !!!

modifica:

#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); 

}