首页 文章

CS50 PSet 2 - Vigenere - 确保关键字是按字母顺序排列的

提问于
浏览
0

我目前正在使用语言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 回答

  • 1
    if(isalpha(k[i]))
        {
        return 0;
        }
    

    一旦 argv[1] 中有一个字母,就会退出该程序 . 相反,您希望继续循环,直到检查完所有字符 . 所以,做:

    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];
    ...
    

相关问题