Caesars密码-条件跳转或移动取决于未初始化的值

Caesars密码-条件跳转或移动取决于未初始化的值,c,arrays,string,valgrind,caesar-cipher,C,Arrays,String,Valgrind,Caesar Cipher,我的学校项目有问题。该项目是关于凯撒密码的,程序输入包括消息长度、加密消息和截获较差的消息(几个字符是正确的)。程序的输出是一条解密的消息。程序正确解密,但Valgrind的输出中有错误。此外,我认为我对输入数据条件的处理很差 这是我的节目: #include <stdio.h> #include <stdlib.h> #include <string.h> /* One character rotation */ char rotate(char orig

我的学校项目有问题。该项目是关于凯撒密码的,程序输入包括消息长度、加密消息和截获较差的消息(几个字符是正确的)。程序的输出是一条解密的消息。程序正确解密,但Valgrind的输出中有错误。此外,我认为我对输入数据条件的处理很差

这是我的节目:

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

/* One character rotation */
char rotate(char original, int offset){
  char * alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

  if (original >= 'A' && original <= 'Z') {
    return alpha[(original - 'A' + offset) % 52];
  }
  else{
    return alpha[(original - 'a' + 26  + offset) % 52];
  }
}

/* String decoding */
void shift(const char *src, char *dst, int offset){
  for (int i = 0; i < strlen(src); i++) {
    dst[i] = rotate(src[i], offset);
  }
}

void printResult(char * coded, char * tapped, int size) {
  char decoded[size];
  int matchingLetters = 0, max = 0, recording = 0;
  for (int i = 0; i <= 52; i++) {
    shift(coded, decoded, i);

    // Zjisteni poctu matchingLetters pismen
    for (int j = 0; j < size; j++ ) {
      if(tapped[j] == decoded[j])
        matchingLetters++;
    }
    if(matchingLetters >= max){
      recording = i;
      max = matchingLetters;
    }
    matchingLetters = 0;
  }
  shift(coded, decoded, recording);
  printf("%s\n",decoded);
}

/* The main program */
int main(int argc, char *argv[])
{
  int size;

  if (scanf("%d\n", &size) != 1) {
    printf("Error: bad input!\n");
    return 100;
  }

  char coded[size + 1];
  char tapped[size + 1];

  if (scanf("%[a-zA-Z]\n", coded) != 1 || scanf("%[a-zA-Z]\n", tapped) != 1) {
    printf("Error: bad input!\n");
    return 100;
  }

  if (strlen(coded) != size || strlen(tapped) != size) {
    fprintf(stderr, "Error: bad input length!");
    return 101;
  }

  printResult(coded, tapped, size);

  return 0;
}
谢谢你的建议

  • Shift不会终止dst(已解码),这可能会导致strlen进入其他内存
  • Decoded不够大,无法包含字符串终止符
  • 请注意:

    for (int i = 0; i < strlen(src); i++)
    
    for(int i=0;i
    对于许多C程序员来说,这就像黑板上的钉子。编译器是否会清理它并不重要

  • Shift不会终止dst(已解码),这可能会导致strlen进入其他内存
  • Decoded不够大,无法包含字符串终止符
  • 请注意:

    for (int i = 0; i < strlen(src); i++)
    
    for(int i=0;i

    对于许多C程序员来说,这就像黑板上的钉子。编译器是否会清理它并不重要。

    您的输入是什么?您可以通过清除位
    0x20
    ,然后或返回小写位,强制将其转换为大写。那么你就不需要树枝了,你的桌子就只有原来的一半大了。当然,你根本不需要查找,只要
    -'a'
    ,add,modulo,
    +'a'
    。您基本上是使用查找表来实现
    +'a'
    。您的输入是什么?您可以通过清除位
    0x20
    ,然后或返回小写位来强制使用大写。那么你就不需要树枝了,你的桌子就只有原来的一半大了。当然,你根本不需要查找,只要
    -'a'
    ,add,modulo,
    +'a'
    。您基本上是使用查找表来实现
    +'a'