C:重新提示将值输入 argv[] - 不会因错误而关闭 - Caesar Cipher
C: Reprompting to enter value into argv[] - without closing by error - Caesar Cipher
我是编程新手,正在学习 eDX 上的 CS50 哈佛课程。我们有凯撒密码的作业,我对我的代码很满意,尽管它并不完美。但是我不确定在不提供任何参数时如何使程序不被错误关闭。
根据课程分配,它应该是可能的并且输出应该是 "Usage: ./caesar key" - 如果我使用字符串而不是整数值或者插入多个值,它就可以工作。但是对于空值(./caesar),我在终端中遇到错误。有什么办法可以避免这种情况,而只是像输入字符串那样关闭程序?已经检查了多个主题,但无法找到该怎么做。
谢谢
PS: 已经提交了作业,但在我看来,我仍然回到这个话题,想知道是否可能以及如何:D
#include <cs50.h>
#include <stdio.h>
#include <string.h>
int main(int argc, string argv[])
{
int k = atoi(argv[1]);
if (argc != 2 || argv[1] == NULL || k <= 0)
{
printf("Usage: ./caesar key\n");
return(1);
}
string p = get_string("Plaintext: ");
printf("Ciphertext: ");
//incrementing each letter
for (int i = 0, n = strlen(p); i < n; i++)
{
//for capital letters
if (p[i] >= 65 && p[i] <= 90)
{
//refreshing alphabet char counting to 65
if (p[i] + k > 90)
{
int m = ((p[i] + k) - 90);
char c = 64 + m;
printf("%c", c);
}
else
{
printf("%c", p[i] + k);
}
}
//for non-capital letters
if (p[i] >= 97 && p[i] <= 122)
{
//refreshing alphabet char counting to 97
if (p[i] + k > 122)
{
int m = ((p[i] + k) - 122);
char c = 96 + m;
printf("%c", c);
}
else
{
printf("%c", p[i] + k);
}
}
//for non-letter characters
if (p[i] < 65 || p[i] > 122)
{
printf("%c", p[i]);
}
}
printf("\n");
}
您需要在开始访问 argv
之前检查 argc
的值。因此,与其设置 k
然后进行这些检查,不如进行大部分检查,然后分配 k
,然后检查 k
是否为合法值。
int k;
if (argc != 2 || argv[1] == NULL)
{
printf("Usage: ./caesar key\n");
return(1);
}
k = atoi(argv[1]);
if (k <= 0)
{
printf("Usage: ./caesar key\n");
return(1);
}
我是编程新手,正在学习 eDX 上的 CS50 哈佛课程。我们有凯撒密码的作业,我对我的代码很满意,尽管它并不完美。但是我不确定在不提供任何参数时如何使程序不被错误关闭。
根据课程分配,它应该是可能的并且输出应该是 "Usage: ./caesar key" - 如果我使用字符串而不是整数值或者插入多个值,它就可以工作。但是对于空值(./caesar),我在终端中遇到错误。有什么办法可以避免这种情况,而只是像输入字符串那样关闭程序?已经检查了多个主题,但无法找到该怎么做。
谢谢
PS: 已经提交了作业,但在我看来,我仍然回到这个话题,想知道是否可能以及如何:D
#include <cs50.h>
#include <stdio.h>
#include <string.h>
int main(int argc, string argv[])
{
int k = atoi(argv[1]);
if (argc != 2 || argv[1] == NULL || k <= 0)
{
printf("Usage: ./caesar key\n");
return(1);
}
string p = get_string("Plaintext: ");
printf("Ciphertext: ");
//incrementing each letter
for (int i = 0, n = strlen(p); i < n; i++)
{
//for capital letters
if (p[i] >= 65 && p[i] <= 90)
{
//refreshing alphabet char counting to 65
if (p[i] + k > 90)
{
int m = ((p[i] + k) - 90);
char c = 64 + m;
printf("%c", c);
}
else
{
printf("%c", p[i] + k);
}
}
//for non-capital letters
if (p[i] >= 97 && p[i] <= 122)
{
//refreshing alphabet char counting to 97
if (p[i] + k > 122)
{
int m = ((p[i] + k) - 122);
char c = 96 + m;
printf("%c", c);
}
else
{
printf("%c", p[i] + k);
}
}
//for non-letter characters
if (p[i] < 65 || p[i] > 122)
{
printf("%c", p[i]);
}
}
printf("\n");
}
您需要在开始访问 argv
之前检查 argc
的值。因此,与其设置 k
然后进行这些检查,不如进行大部分检查,然后分配 k
,然后检查 k
是否为合法值。
int k;
if (argc != 2 || argv[1] == NULL)
{
printf("Usage: ./caesar key\n");
return(1);
}
k = atoi(argv[1]);
if (k <= 0)
{
printf("Usage: ./caesar key\n");
return(1);
}