我第一次来这里,我是一名编程新手,我遇到了一个问题,找不到任何解决方案。 我正在编写一个代码来进行维吉尼亚密码,但我遇到了问题:
首先:要输入Key,假设key是; “啊啊”
第二:要加密的文本,假设文本是:“alligator”
密码应该是:
鳄鱼
+
aaa|aaa|aaa(重新运行文本中每个额外字母的键 vs 键)
一个 + A 加密的第一个字母;
所有文字:
bmmjhbups
我的问题是如何用较短的 abc 循环遍历 alligator?在我所有的尝试中,当循环传递它时,abc 变为零,而不是当文本循环传递 abc 的长度时从头开始。 我还尝试过使用 strcpy 和连接,以便 abc 在 alligator 处变得相同的 strlength,但由于字符串乞求中的奇怪符号,我在 strcpy 和 cat 方法中遇到了问题。 关于循环如何通过更大的循环工作,是否有一个简单的解决方案?
最佳答案
虽然我可能不应该发布此内容(因为没有提供代码示例),但这里有一段代码可以满足您的需求。不过,有几个想法:
根据Vigenere wiki ,每个字母都有一个与之关联的数字:
- a .. 0
- b .. 1
- ...
- z .. 25
当添加 2 个字母时,它们的值会被添加,然后将
% 26
(模)应用于结果。例如。 'a' + 'a' = (0 + 0) % 26 = 0 也是 a (与 b 您所期望的),这就是为什么我必须添加CUSTOM_OFFSET
将表中的每个结果(向前)移动 1。密码适用于大写或小写字母,而不适用于两者(或任何其他字符)。也许可以添加一些
text
和key
验证例程。无论如何,在这种情况下,都使用小写。
代码:
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define BASE_CHR 'a' //Change it to 'A' if working with uppercases (can't have both)
#define ALPHABET_LEN ('z' - 'a' + 1)
#define CUSTOM_OFFSET 1 //According to specs should be 0, but it wouldn't match the current requirements
int main() {
char *text = "alligator", *key = "aaa", *new_text = NULL;
size_t text_len = strlen(text), key_len = strlen(key), i = 0;
if ((new_text = (char*)calloc(text_len + 1, sizeof(char))) == NULL) {
printf("Malloc error\n");
return 1;
}
for (i = 0; i < text_len; i++)
new_text[i] = ((text[i] - BASE_CHR + key[i % key_len] - BASE_CHR + CUSTOM_OFFSET) % ALPHABET_LEN) + BASE_CHR;
printf("Text: %s, Key: %s, Crypted: %s\n", text, key, new_text);
free(new_text);
new_text = NULL;
return 0;
}
输出:
Text: alligator, Key: aaa, Crypted: bmmjhbups
关于C 循环遍历一个小数组并添加到一个大数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37789451/