我正在做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()
,它接受一个指向字符的指针,并保存第一个无效字符的位置。
然后,你可以通过检查返回的指针是否指向终端的null字符来检查输入是否是数字。
char* p;
int k = (int)strtol (argv[1], &p, 10);
if (*p != '\0') {
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;
}
}