2013-02-14 61 views
0

該程序應該輸出VYGHBUTMDE,但它會在最後附加一些垃圾字符。爲什麼是這樣?字符數組打印額外的垃圾內存

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

int 
encrpypt(char ciphertext_buffer[], char plaintext[], char key[]) { 
    int i; 
    for (i=0; i<strlen(plaintext); i++) { 
    ciphertext_buffer[i] = (char) ((((int)plaintext[i] - 65 + (int)key[i%(strlen(key))] - 65) % 26) + 65); 
    } 
    return 0; 
} 

int 
main() { 
    char ciphertext_buffer[10]; 
    encrpypt(ciphertext_buffer, "THISISCOOL", "CRYPT"); 
    printf("%s\n", ciphertext_buffer); 
    return 0; 
} 

回答

3

既然你只給一個10字節的字符串分配一個10字節的數組,那麼終止空字符就有「無處」的地方。考慮將緩衝區大小增加到至少一個大於「可見」字符中字符串長度的字符。

+0

謝謝:)已經有一段時間,因爲我已經使用C – 2013-02-14 03:31:03

+0

不用擔心,朋友編程!我希望解釋是足夠的。 – RustyBuckets 2013-02-14 03:31:45

1

您不是null終止字符串。這裏有一個稍微修改後的版本:(雖然仍有問題)

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

int 
encrpypt(char ciphertext_buffer[], char plaintext[], char key[]) { 
    int i; 
    for (i=0; i<strlen(plaintext); i++) { 
    ciphertext_buffer[i] = (char) ((((int)plaintext[i] - 65 + (int)key[i%(strlen(key))] - 65) % 26) + 65); 
    } 
    ciphertext_buffer[i] = 0; 
    return 0; 
} 

int 
main() { 
    char ciphertext_buffer[11]; 
    encrpypt(ciphertext_buffer, "THISISCOOL", "CRYPT"); 
    printf("%s\n", ciphertext_buffer); 
    return 0; 
} 

一個更大的問題是,你沒有做任何邊界檢查。這是一個更好的版本:

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

int 
encrpypt(char ciphertext_buffer[], char plaintext[], char key[], int size) { 
    int i; 
    for (i=0; i<strlen(plaintext); i++) { 
    if (i > size - 1) break; 
    ciphertext_buffer[i] = (char) ((((int)plaintext[i] - 65 + (int)key[i%(strlen(key))] - 65) % 26) + 65); 
    } 
    ciphertext_buffer[i] = 0; 
    return 0; 
} 

int 
main() { 
    char ciphertext_buffer[11]; 
    encrpypt(ciphertext_buffer, "THISISCOOL", "CRYPT", sizeof(ciphertext_buffer)); 
    printf("%s\n", ciphertext_buffer); 
    return 0; 
} 
1

char數組必須以'/ 0'結尾。所以總是u需要分配字符數組作爲最大字符串大小+ 1

嘗試以下更正。

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

int encrpypt(char ciphertext_buffer[], char plaintext[], char key[]) { 
    int i; 
    for (i=0; i<strlen(plaintext); i++) { 
    ciphertext_buffer[i] = (char) ((((int)plaintext[i] - 65 + (int)key[i%(strlen(key))] - 65) % 26) + 65); 
    } 
ciphertext_buffer[i] = '\0'; 
    return 0; 
} 

int 
main() { 
    char ciphertext_buffer[11]; 
    encrpypt(ciphertext_buffer, "THISISCOOL", "CRYPT"); 
    printf("%s\n", ciphertext_buffer); 
    return 0; 
}