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;
}
4

3 回答 3

7

由于您只为 10 字节字符串分配 10 字节数组,因此终止空字符“无处可去”。考虑将缓冲区大小增加到至少比“可见”字符中的字符串长度大一个字符。

于 2013-02-14T03:27:09.653 回答
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;
}
于 2013-02-14T03:36:07.233 回答
1

字符数组必须以'/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;
}
于 2013-02-14T03:39:40.860 回答