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

CS50 PSet 2 - Vigenere - Making sure keyword is alphabetical

我目前正在使用 C 语言研究 CS50 中的 Vigenere 密码。要求是制作一个基于关键字(用户输入的关键字)对一些明文进行加密的程序。它将基于 Vigenere 密码进行加密。我发现很难用语言来描述 Vigenere 密码是什么,所以这里有一个来自 CS50 规范的例子:

如果 Vigenère 自己想私下向某人打招呼,使用关键字 ABC,他会用密钥 0(即 A)加密 H,用密钥 1(即, B),第一个 L 的密钥为 2(即 C),此时他将没有关键字中的字母,因此他将重用(部分)它来加密第二个 L再次是 0 键(即 A),再次是键为 1(即 B)的 O。所以他会把 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");
    }
   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];
...