如何排除非数字键?CS50凯撒Pset2

问题描述 投票:0回答: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;
}

c cs50 caesar-cipher
1个回答
0
投票

我猜测超时是因为你的程序正在等待明文,而法官没有给出明文,因为它允许你的程序在给出非数字键后立即退出。

你可以使用 strtol(),它接受一个指向字符的指针,并保存第一个无效字符的位置。

然后,你可以通过检查返回的指针是否指向终端的null字符来检查输入是否是数字。

char* p;
int k = (int)strtol (argv[1], &p, 10);
if (*p != '\0') {
    puts("non-numeric key");
    return 1;
}

0
投票

只要循环检查argv[1]的每一个数字,然后检查它是否是一个整数。

for (int i = 0; i < strlen(argv[1]); i++)
{
    if (isdigit(argv[1][i]) == 0)
    {
        return 1;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.