该程序应该输出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;
}
答案 0 :(得分:5)
由于您只为10字节字符串分配10字节数组,因此终止空字符“无处可去”。请考虑将缓冲区大小增加到至少一个字符,该字符大于“可见”字符中字符串的长度。
答案 1 :(得分: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;
}
答案 2 :(得分:1)
Char数组必须以'/ 0'结尾。因此,总是需要将char数组分配为最大字符串大小+ 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;
}