我不知道我是否已经看了太长时间了,但是我的角色保持不变,即如果我的密钥是'b'并以明文形式输入'hello',它仍然为我提供了'你好'。我似乎无法弄清楚我要正确调整字母(即我已将字母0-25编入索引)的缺失之处
非常感谢您提供任何帮助。
enter code here
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int shift(char c);
int main(int argc, string argv[])
{
// Ensure the program has only one command-line
if (argc != 2)
{
printf("Usage: ./vigenere key\n");
return 1;
}
else
{
// Ensure user only enter key in alphabet
string s = (argv[1]);
//Make sure command line argument is alpha
for (int i = 0; i < strlen(s); i++)
{
if (isalpha(s[i]) == false)
{
printf("Usage: ./vigenere key\n");
return 1;
}
}
// Converting string to integers
int key = atoi(argv[1]);
// Prompt user input in plaintext
string plaintext = get_string("plaintext: ");
printf("ciphertext: ");
for (int i = 0; i < strlen(plaintext); i++)
{
// Encrypt and preserve lower case characters
if islower(plaintext[i])
{
// Position of the character in the alphabet
int alphaPos = plaintext[i] + key - 97;
// Keep the number within the alphabet loop
int wrappedChar = alphaPos % 26;
printf("%c", wrappedChar + 97);
}
else if isupper(plaintext[i])
{
int alphaPos = plaintext[i] + key - 65;
int wrappedChar = alphaPos % 26;
printf("%c", wrappedChar + 65);
}
else
{
printf("%c", plaintext[i]);
}
}
printf("\n");
}
return 0;
}
int shift(char c)
{
//TODO
// If isUpper then minus 65
if (isupper(c))
{
return c - 65;
}
// If isLower then minus 97
else if (islower(c))
{
return c - 97;
}
return 0;
}
答案 0 :(得分:0)
这个int key = atoi(argv[1]);
(可能)是问题的根源。看来它是凯撒运动留下的。 atoi
不会检测到错误,因此如果您发送b
作为参数,key
将等于0,因为b
无法转换为int,并且hello
是hello
。
建议您再次回顾一下演练,尤其是Zamyla的熊猫示例。