Caesars密码-条件跳转或移动取决于未初始化的值
我的学校项目有问题。该项目是关于凯撒密码的,程序输入包括消息长度、加密消息和截获较差的消息(几个字符是正确的)。程序的输出是一条解密的消息。程序正确解密,但Valgrind的输出中有错误。此外,我认为我对输入数据条件的处理很差 这是我的节目: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
#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;
}
谢谢你的建议
for (int i = 0; i < strlen(src); i++)
for(int i=0;i
对于许多C程序员来说,这就像黑板上的钉子。编译器是否会清理它并不重要
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'
。