- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我创建了以下代码作为对 CS50x PSET2: Vigenere 的回答,它在某种程度上有效,但是当运行 check50 时,我得到了下面列出的一些错误:
:) vigenere.c exists.
:) vigenere.c compiles.
:) encrypts "a" as "a" using "a" as keyword
:( encrypts "barfoo" as "caqgon" using "baz" as keyword - output not valid ASCII text
:( encrypts "BaRFoo" as "CaQGon" using "BaZ" as keyword - output not valid ASCII text
:) encrypts "BARFOO" as "CAQGON" using "BAZ" as keyword
:( encrypts "world!$?" as "xoqmd!$?" using "baz" as keyword- output not valid ASCII text
:( encrypts "hello, world!" as "iekmo, vprke!" using "baz" as keyword- output not valid ASCII text
:) handles lack of argv[1]
:) handles argc > 2
:( rejects "Hax0r2" as keyword - timed out while waiting for program to exit
似乎发生的情况是 key 包含高值(即 z/Z),它导致代码跳到下一行并错过看似随机序列的内容。例如。在字符串的第一个单词中,它错过了第 3 个字符,然后是第二个单词,它错过了第 3 个和第 4 个字符,然后是第 3 个单词第 1 个。我只是不明白发生了什么。
我使用 printf 来确保设置和传递给函数的所有变量在运行时都是正确的。函数本身返回正确的响应(Hax0r2 的验证除外)。我尝试通过将结果与在线 vigenere 密码工具进行比较来进行调试。
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
int Validate1(int argc);
int Validate2(string argv);
void Cypher(string x);
void KeyCalc(string argv);
string MESSAGE;
int LENGTH;
int *KEY;
int COUNTER = 0;
int main(int argc, string argv[])
{
//Check if right amount of arguments are supplied
int Val1 = Validate1(argc);
if (Val1 == 0)
{
//Check if argument is a string of chars
int Val2 = Validate2(argv[1]);
if (Val2 == 0)
{
//get the string length
LENGTH = strlen(argv[1]);
//Dynamically update KEY array length
KEY = (int *)malloc(LENGTH * sizeof(*KEY));
if (KEY == NULL)
{
fprintf(stderr, "malloc failed\n");
}
//calculate the key
KeyCalc(argv[1]);
//get the message from the user to be encrypted
MESSAGE = get_string("plaintext: ");
printf("ciphertext: ");
//encrypt message from user
Cypher(argv[1]);
free(KEY);
return 0;
}
else
{
//validation failed
printf("Usage: ./vigenere keyword\n");
return 1;
}
}
else
{
//validation failed
printf("Usage: ./vigenere keyword\n");
return 1;
}
}
//Validate the number of arguments supplied
int Validate1(int argc)
{
if (argc != 2)
{
return 1;
}
else
{
return 0;
}
}
//Validate the argument is a string
int Validate2(string argv)
{
int k = 0;
//loop through all characters in argument line string and check if alphabetic
for (int i = 0; i < LENGTH; i++)
{
if isalpha(argv[i])
{
//Do Nothing
}
else
{
k++;
}
}
//k counts the number of non-alphabetic characters, so if > 0 then invalid input
if (k > 0)
{
return 1;
}
else
{
return 0;
}
}
void Cypher(string x)
{
//identify the length of the message to be coded
int Mlength = strlen(MESSAGE);
//identify the length of the key
int Slen = strlen(x);
//cycle through all characters in message supplied by user
for (int i = 0; i < Mlength; i++)
{
// loop through key
if (COUNTER > Slen - 1)
{
COUNTER = 0;
}
//check if the character is alphabetic
if (isalpha(MESSAGE[i]))
{
//convert the character to ASCII int value
char l = MESSAGE[i];
//add key value to message value and wrap around ascii mapping
if (isupper(MESSAGE[i]))
{
l = l + KEY[COUNTER];
if (l > 'Z')
{
l = l - 26;
}
}
else
{
l = l + KEY[COUNTER];
if (l > 'z')
{
l = l - 26;
}
}
//convert value back into character and store in array
MESSAGE[i] = (char) l;
// print character
printf("%c", MESSAGE[i]);
COUNTER++;
}
else
{
//character is 'numeric' or 'symbol' or 'space' just display it
printf("%c", MESSAGE[i]);
}
}
printf("\n");
}
void KeyCalc(string argv)
{
//convert key entry to values A/a = 0 to Z/z = 26
for (int i = 0; i < LENGTH; i++)
{
char k = argv[i];
if (islower(argv[i]))
{
KEY[i] = k - 'a';
}
else
{
KEY[i] = k - 'A';
}
}
}
最佳答案
来自 caesar pset 的规范:
...Caesar’s algorithm (i.e., cipher) encrypts messages by “rotating” each letter by k positions. More formally, if p is some plaintext (i.e., an unencrypted message), pi is the ith character in p, and k is a secret key (i.e., a non-negative integer), then each letter, ci, in the ciphertext, c, is computed as
ci = (pi + k) % 26
这个算法(在任何一种“情况下”)都不会这样做:
l = l + KEY[COUNTER];
if (l > 'Z')
{
l = l - 26;
}
This walkthrough从 9:30 开始是关于如何实现“转变”的一个很好的入门。
此代码中问题的最直接原因是此 l = l + KEY[COUNTER];
可以产生 ascii range 之外的结果.在 CS50 实现中,char
默认为 signed 字符。因此,例如,'r' + 'z'(如“barfoo”中用“baz”加密)将产生 -117。
关于c - PSET 2 : Vigenere Cipher partially working?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57337788/
我不知道为什么这不能编译,对我来说看起来不错。想要制作一个程序来构建像 super 马里奥关卡末尾那样的金字塔。会询问用户 获取一个数字,然后将金字塔 build 到该高度。 #include #i
我以为我已经完成了 Caesar,但是当运行 CHeck50 时,我的代码因以下原因失败:使用 23 作为 key 将“barfoo”加密为“yxocll”输出无效的 ASCII 文本日志运行./凯撒
我对编程真的很陌生,我刚刚开始在哈佛的 CS50 上尝试一些问题集。如果有人能向我指出为什么我的代码是错误的,我将不胜感激。 编译并运行代码后,没有任何输出。 另一方面,有人可以向我解释一下“roun
我意识到,当我在 bool 搜索中包含“else return false”时,它永远无法“找到针”。相反,如果我要删除那部分,程序就可以正常工作。它能够找到 2008 而找不到 2013。知道为什么
我正在编写一个程序,它接受输入并打印出使用的最少数量的硬币。当我运行程序并输入内容时,它没有按预期工作并且不打印任何内容。我在这里做错了什么? #include #include int main
我目前正在尝试CS50的Pset2,在caesar.c中,用户应该通过argv输入k;如果他不这样做,我就应该“大喊大叫”用户告诉他使用命令行参数。但如果我尝试以下操作,我总是会遇到段错误。 #inc
问题集要求我们使用哈希创建一个半金字塔。这是它的外观图像的链接 - 我明白了这个想法并编写了程序,直到打印空格(我已将其替换为“_”,以便我可以测试它的前半部分。 但是,当我尝试运行我的程序时,它不会
我正在尝试解决problem 1A on codeforces 但我不断收到测试:#1,时间:0 毫秒,内存:1828 KB,退出代码:1,检查器退出代码:0,结论:RUNTIME_ERROR你可以查
我目前正在使用 C 语言研究 CS50 中的维吉尼亚密码。要求是制作一个程序,根据关键字(两者都是用户输入的)对一些明文进行加密。它将基于维吉尼亚密码进行加密。我发现很难用语言描述 Vigenere
这是 edX.org 上 CS50 类(class)的 PSET 3。 我已经为这个问题集苦苦挣扎了很长时间;特别是,我无法使 binarySearch 函数工作。我一直遇到段错误,但我不知道如何处理
我正在研究 Pset 2 hack.c,到目前为止,我已经设法了解了总体概念。但是,我的代码仍然不起作用。它编译并运行但不打印任何内容。 我不完全确定这里出了什么问题,我可能忽略了一些东西? #inc
我陷入了调整大小问题的垂直调整大小部分。我从 Zamayla 的伪代码中知道,我每次都需要在输出文件上写入一个数组,但我不知道如何将值从一个传递到另一个。我是否需要使用 malloc 函数并通过指针传
我遵循了 pset 3 recover 的伪代码,我的代码只输出一个图像,调试器 (debug50) 在 number = fread(buffer, 1, 512, file); 中循环 4 次后退
我是这个主题的新手。我尝试自己调试此问题,但是出现了段错误核心转储,我无法弄清楚原因。有人可以帮我吗? # include # include # include # include int main
我正在尝试制作一个程序,提供最少数量的硬币找零,但如果我给出的数字不是可分为四等分的数字,它就会惨败。例如,如果我输入 1.25,我会得到 5 个 25 美分,但如果我输入 1.26,我会得到 5 个
#include #include #include "bmp.h" int main(int argc, char *argv[]) { // ensure proper usage
我对 cs50 pset 1(马里奥不太舒服)的解决方案没有打印出金字塔。相反,它只是打印出一个#。我已经尝试了多次,但我在尝试编译时得到的只是错误,说它不能识别 int i 或者分号应该移到新行。更
我创建了以下代码作为对 CS50x PSET2: Vigenere 的回答,它在某种程度上有效,但是当运行 check50 时,我得到了下面列出的一些错误: :) vigenere.c exists.
我不太明白这些错误从何而来。我正在尝试创建一个简单的 C 程序,它接受一个字符串并向 ASCII 值添加偏移量,以便创建一个极其简单的加密。 #include #include #include
我目前正在学习 CS50 类(class),但我完全陷入了调整大小的问题(不太舒服)。任务是制作一个程序,该程序接受输入 .bmp 文件,将其缩放 n 次并将其写入输出 .bmp 文件。但我的代码只是
我是一名优秀的程序员,十分优秀!