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];
...
我目前正在使用 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];
...