在减号的邮件末尾将打印一些额外的字符

时间:2019-03-03 06:29:02

标签: c

#include<stdio.h>
char arr[75][75];
char message[22], key[22], emessage[22], retMessage[22];
int findRow(char);
int findColumn(char);
int findDecRow(char, int);

int main() {
  int i = 0, j, k, r, c;
  k = 47;
  for (i = 0; i < 75; i++) {
    k++;
    for (j = 0; j < 75; j++) {
      arr[i][j] = k++;
      if (k == 123)
        k = 48;
    }
  }
  printf("\nENTER MESSAGE TO ENCRYPT\n");
  gets(message);
  printf("\nENTER THE KEY TO ENCRYPT THE MESSAGE\n");
  gets(key);
  // Encryption
  for (i = 0; key[i] != NULL; i++) {
    c = findRow(key[i]);
    r = findColumn(message[i]);
    emessage[i] = arr[r][c];
  }
  emessage[i] = '\0';
  printf("\nENCRYPTED MESSAGE IS:\n\n");
  for (i = 0; emessage[i] != NULL; i++)
    printf("%c", emessage[i]);
  //decryption
  for (i = 0; key[i] != NULL; i++) {
    c = findColumn(key[i]);
    r = findDecRow(emessage[i], c);
    retMessage[i] = arr[r][0];
  }
  retMessage[i] = '\0';
  printf("\n\nMESSAGE DECRYPTED IS (ORIGINAL MESSAGE):\n\n");
  for (i = 0; retMessage[i] != NULL; i++)
    printf("%c", retMessage[i]);
  getch();
  return (0);
}

int findRow(char c) {
  int i;
  for (i = 0; i < 75; i++) {
    if (arr[0][i] == c)
      return (i);
  }
}

int findColumn(char c) {
  int i;
  for (i = 0; i < 75; i++) {
    if (arr[i][0] == c)
      return (i);
  }
}

int findDecRow(char c, int j) {
  int i;
  for (i = 0; i < 75; i++) {
    if (arr[i][j] == c)
      return (i);
  }
}

这是我的代码,用于使用Vernam Cipher加密和解密消息。除了解密部分,其他所有东西都工作正常。在解密邮件的末尾会打印一些额外的字符。 例如:

 Message: 571635
 key: BYUg872e78
 Cipher: G`Vm;<
 Decrypted Msg: 571635a
 Expected msg: 571635

在解密消息的末尾将打印一个额外的字符'a'
如何在我的代码中对其进行更正?

2 个答案:

答案 0 :(得分:2)

提示:findRow(c)不在c中时,arr[]的返回值是什么?

悬而未决

  

它丢失了-这导致c = findRow(key[i]);和其他行为出现未定义的行为(UB)。

启用所有警告以节省时间。

您可能会收到类似的信息

warning: control reaches end of non-void function [-Wreturn-type]

findRow(), findColumn(), findDecRow()

的末尾

存在其他问题。

答案 1 :(得分:1)

您的编码和解码中断。 您不会在意密钥和消息是否一样长。

如果密钥比消息短,则仅对消息的一部分进行编码。然后在该位置终止结果。到目前为止,除了丢失部分消息外,这还不错。

如果密钥比消息长,则尝试对用户未输入的消息中的字符进行编码。 首先,您将尝试在最后一个消息字符之后编码终止符'\0'。 这将失败,因为findcolumn不会返回正确的值并调用未定义的行为。您可能会在加密的邮件中存储一些“随机”字符。 邮件中的其他任何字符都类似。

在解码时,您尝试对那些随机内容进行解码,并且不太可能再次获得初始的'\0'。相反,您会从解码中获得“随机”结果。

听有关不返回非void函数值的警告,至少会在您尝试对某些可疑值进行编码或解码时向您显示,您可以了解为什么会发生这种情况。