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

} 

Output:XORING "Hello World!" cắt chuỗi

Hell 

Tại sao nó cắt tất cả mọi thứ sau khi đốm thư tương ứng với số phím XOR (trong trường hợp này, ASCII 'w')? Trong logic toán học, N^N=00^N=N, phải không?

+1

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

+0

Đây được coi là mã hóa XOR đơn giản, phải không? – Linuxios

+0

Không phải là một bài tập về nhà, tôi nghĩ rằng đó chỉ là một bài tập tốt và súc tích cho sự cảm nhận. Tôi là tác giả của câu hỏi này =) – 0x6B6F77616C74

Trả lời

56

'o' là mã ASCII 111 và XORING 111 với 111 sản lượng 0, NUL và chấm dứt chuỗi của bạn. Khi điều này xảy ra (ngay cả trong vòng đầu tiên, vì bạn đang đánh giá nó mỗi lần qua vòng lặp), strlen báo cáo chuỗi ngắn hơn nhiều và các vòng dừng lại.

Lưu độ dài chuỗi trước khi xem qua XOR sẽ giúp bạn tiết kiệm được điều này.

+6

Lưu ý rằng để khắc phục điều này, anh ta nên lưu giá trị trả về của 'strlen' trước khi anh ta biến đổi chuỗi. –

+3

@NicolBolas Ông biến đổi nó và sau đó unmutates nó và sau đó chuỗi gốc thu được, vì vậy bằng chứng: http://ideone.com/omgw0 –

+3

+1. Lưu ý rằng xoring ảnh hưởng đến vòng lặp đầu tiên quá - nó không đi sau 'o'. – asaelr

10

Điều này là do khi bạn xor một số với chính nó, nó trở thành số không, và khi strlen thấy số không, nó nghĩ rằng đó là kết thúc của chuỗi.

Nếu bạn lưu trữ độ dài trong một biến trước vòng lặp đầu tiên và sau đó sử dụng độ dài đã lưu trong vòng lặp thứ hai thay vì strlen, chương trình của bạn sẽ tạo ra kết quả mong đợi.

4

greeting[5] là 'o' là 111 in ASCII. Do đó lời chào [5]^111 sẽ bằng không (sẽ kết thúc chuỗi của bạn) Strlen trong vòng lặp thứ hai sẽ trả về một giá trị khác.

Để khắc phục điều này, hãy sử dụng biến len để lưu trữ strlen gốc. Bạn sẽ nhận được chuỗi của bạn trở lại !!!

Modified:

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

}