【发布时间】:2020-04-24 01:49:07
【问题描述】:
我刚开始学习计算机科学。
我正在通过在哈佛在线教授的 CS50 学习。 好吧,我正在解决这个问题,我需要在命令行中从用户那里获取密钥, 然后是纯文本,然后将该文本转换为 ASCII 中的关键数字量以生成密文。
这是我到目前为止所得到的。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
int main(int argc, string argv[])
{
if (argc != 2)
{
printf("Usage: ./caesar key\n");
}
{
string plaintext = get_string("plaintext: ");
int key = atoi(argv[1]);
int n = strlen(plaintext);
char chr[n];
printf("ciphertext: ");
for (int i = 0; i < n; i++)
{
chr[i] = plaintext[i];
if (isalpha(chr[i]))
{
if (isupper(chr[i]))
{
chr[i] = (chr[i] - 65 + key) % 26 + 65;
printf("%c",chr[i]);
}
else if (islower(chr[i]))
{
chr[i] = (chr[i] - 97 + key) % 26 + 97;
printf("%c",chr[i]);
}
}
else
{
printf("%c",chr[i]);
}
}
printf("\n");
}
}
好吧,我知道这看起来很松散,但是伙计,这是我在全职工作的同时进行编程的第二周。
无论如何,我正在尝试让用户使用 ./caesar "任意数字的键"。
如果用户放入任何其他东西,那么我想打印 "用法:./凯撒键\n"
到目前为止,我能想到的唯一方法是使用 argc 进行 if 语句!= 2 这样我至少可以确保用户在程序名称之上只输入一个命令。
但问题是,如果用户放入其他内容,例如 ./凯撒你好 ./凯撒YolO
程序仍在运行。
我正在努力弄清楚我能做些什么来防止这种情况发生。
非常感谢您抽出宝贵时间阅读本文并提供帮助。
【问题讨论】:
-
看起来您在最初的
if之后缺少一个else? -
我建议使用
'A'代替65和'a'代替97。 -
我很确定你的 main 应该是
int main(int argc, char* argv[])参见 this SO Q/A - 除非我在 C++ 方面落后了...... -
C 中没有
string类型。 -
@1005hoon RobertS - 恢复 Monica 的观点很好,这应该是 C 还是 C++?
标签: c cs50 caesar-cipher