我目前正在使用语言C在CS50中处理Vigenere密码。要求是制作一个程序,该程序根据关键字(用户输入的两个)加密一些明文。它将基于Vigenere密码进行加密。我发现很难用文字描述Vigenere密码是什么,所以这里是CS50规范的一个例子:
如果Vigenère本人希望通过使用关键字(例如,ABC)来保密地对某人说HELLO,他会使用0(即A)的密钥加密H,使用1的密钥加密E(即B) ),并且第一个L的键为2(即C),此时他将不在关键字中的字母中,因此他将重用(部分)它用密钥加密第二个L再次为0(即A),并且O的键为1(即B)。所以他会把HELLO写成HFNLP。
关键字必须是所有字母字母的字符串,并且必须作为第二个命令行参数给出,即我的代码中的argv [1]。我遇到的问题是,如果不是按字母顺序排列,我就无法让程序拒绝该密钥,如果按字母顺序排列则不能继续。我试过这样做(见下面的代码),如果我在argv [1]中包含一个数字,它就不会返回printf错误信息。有人可以提供一些有关错误的建议吗?如果格式不是很好,请道歉..
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
// declare command line argument variables
int main(int argc, string argv[])
{
string k = argv[1];
//return error if there aren't two command line arguments
if (argc != 2)
{
printf("Usage: ./vigenere k\n");
return 1;
}
//make sure key is all alphabetical
for (int i = 0; i < strlen(k); i++)
{
if(isalpha(k[i]))
{
return 0;
}
else
{
return 1;
printf("Please ensure all characters are alphabetical.\n");
}
}
}
我也尝试过这样,而不是上面的for循环中的内容,它不起作用:
if(!isalpha(k[i]))
{
return 1;
printf("Please ensure all characters are alphabetical.\n");
}
答案 0 :(得分:1)
if(isalpha(k[i]))
{
return 0;
}
在argv[1]
中出现字母后立即退出该程序。相反,您希望继续循环,直到 all 检查字符为止。所以,做:
for (size_t i = 0; i < strlen(k); i++)
{
if(!isalpha(k[i]))
{
printf("Please ensure all characters are alphabetical.\n");
return 1;
}
}
您还需要在使用argv[1]
之前检查参数
if (argc != 2)
{
printf("Usage: ./vigenere k\n");
return 1;
}
string k = argv[1];
...