如何排除非数字键? CS50 凯撒 Pset2
How can I exclude non-numeric keys? CS50 Caesar Pset2
我正在做 CS50 凯撒问题,在大多数情况下,我的代码都可以运行。我无法通过其中一项 check50 测试 - 我的代码不处理非数字键,并且在等待程序退出时超时。
我试过使用 isdigit 但它似乎不起作用。
下面复制粘贴的 check50 测试结果:
:) caesar.c exists.
:) caesar.c compiles.
:) encrypts "a" as "b" using 1 as key
:) encrypts "barfoo" as "yxocll" using 23 as key
:) encrypts "BARFOO" as "EDUIRR" using 3 as key
:) encrypts "BaRFoo" as "FeVJss" using 4 as key
:) encrypts "barfoo" as "onesbb" using 65 as key
:) encrypts "world, say hello!" as "iadxp, emk tqxxa!" using 12 as key
:) handles lack of key
:( handles non-numeric key
timed out while waiting for program to exit
:) handles too many arguments
#include <stdio.h>
#include <cs50.h>
#include <math.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
int main (int argc, string argv[])
{
if (argc == 2 && (isdigit(argv[1] !=0))
{
int k = atoi (argv[1]); // convert string to int
string s = get_string ("plaintext: "); // obtain text
printf("ciphertext: ");
for (int i = 0; i < strlen(s); i++) // text loop
{
if (s[i] >= 'a' && s[i] <= 'z')
{
printf("%c", 'a' + ((s[i] - 'a') + k) % 26);
}
else if (s[i] >= 'A' && s[i] <= 'Z')
{
printf("%c", 'A' + ((s[i] - 'A') + k) % 26);
}
else
{
printf("%c", s[i]);
}
}
printf("\n");
return 0;
}
else
{
printf("./caesar key\n");
}
return 1;
}
我猜超时是因为你的程序正在等待明文,而法官没有给出明文,因为它排除了你的程序在给出非数字密钥后立即退出。
您可以使用 strtol()
,它接受指向字符的指针并保存第一个无效字符的位置。
然后,您可以通过检查返回的指针是否指向终止空字符来检查输入是否为数字。
char* p;
int k = (int)strtol (argv[1], &p, 10);
if (*p != '[=10=]') {
puts("non-numeric key");
return 1;
}
只需遍历 argv[1] 的每个数字并检查它是否为整数。
for (int i = 0; i < strlen(argv[1]); i++)
{
if (isdigit(argv[1][i]) == 0)
{
return 1;
}
}
我正在做 CS50 凯撒问题,在大多数情况下,我的代码都可以运行。我无法通过其中一项 check50 测试 - 我的代码不处理非数字键,并且在等待程序退出时超时。
我试过使用 isdigit 但它似乎不起作用。
下面复制粘贴的 check50 测试结果:
:) caesar.c exists.
:) caesar.c compiles.
:) encrypts "a" as "b" using 1 as key
:) encrypts "barfoo" as "yxocll" using 23 as key
:) encrypts "BARFOO" as "EDUIRR" using 3 as key
:) encrypts "BaRFoo" as "FeVJss" using 4 as key
:) encrypts "barfoo" as "onesbb" using 65 as key
:) encrypts "world, say hello!" as "iadxp, emk tqxxa!" using 12 as key
:) handles lack of key
:( handles non-numeric key
timed out while waiting for program to exit
:) handles too many arguments
#include <stdio.h>
#include <cs50.h>
#include <math.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
int main (int argc, string argv[])
{
if (argc == 2 && (isdigit(argv[1] !=0))
{
int k = atoi (argv[1]); // convert string to int
string s = get_string ("plaintext: "); // obtain text
printf("ciphertext: ");
for (int i = 0; i < strlen(s); i++) // text loop
{
if (s[i] >= 'a' && s[i] <= 'z')
{
printf("%c", 'a' + ((s[i] - 'a') + k) % 26);
}
else if (s[i] >= 'A' && s[i] <= 'Z')
{
printf("%c", 'A' + ((s[i] - 'A') + k) % 26);
}
else
{
printf("%c", s[i]);
}
}
printf("\n");
return 0;
}
else
{
printf("./caesar key\n");
}
return 1;
}
我猜超时是因为你的程序正在等待明文,而法官没有给出明文,因为它排除了你的程序在给出非数字密钥后立即退出。
您可以使用 strtol()
,它接受指向字符的指针并保存第一个无效字符的位置。
然后,您可以通过检查返回的指针是否指向终止空字符来检查输入是否为数字。
char* p;
int k = (int)strtol (argv[1], &p, 10);
if (*p != '[=10=]') {
puts("non-numeric key");
return 1;
}
只需遍历 argv[1] 的每个数字并检查它是否为整数。
for (int i = 0; i < strlen(argv[1]); i++)
{
if (isdigit(argv[1][i]) == 0)
{
return 1;
}
}