我目前正在使用语言C在CS50中处理Vigenere密码 . 要求是制作一个程序,该程序根据关键字(用户输入的两个)加密一些明文 . 它将基于Vigenere密码进行加密 . 我发现很难用文字描述Vigenere密码是什么,所以这里是CS50规范的一个例子:
如果Vigenère本人想要通过使用关键字(例如,ABC)来保密地对某人说HELLO,他会使用0(即A)的密钥加密H,使用1的密钥(即B)加密,并且密钥为2的第一个L(即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");
}
1 回答
一旦
argv[1]
中有一个字母,就会退出该程序 . 相反,您希望继续循环,直到检查完所有字符 . 所以,做:您还需要在使用
argv[1]
之前进行参数检查 .