Как я могу исключить нечисловые ключи c? CS50 Цезарь Pset2 - PullRequest
0 голосов
/ 06 мая 2020

Я решаю задачу CS50 Caesar, и мой код по большей части работает. Я не могу пройти один из тестов check50 - мой код не обрабатывает нечисловые c ключи, и время ожидания выхода программы истекло.

Я пробовал использовать isdi git но похоже, что это не работает.

Результаты тестов 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;
}

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

Просто l oop через каждые di git argv [1] и проверьте, является ли оно целым числом.

for (int i = 0; i < strlen(argv[1]); i++)
{
    if (isdigit(argv[1][i]) == 0)
    {
        return 1;
    }
}
0 голосов
/ 06 мая 2020

Я предполагаю, что тайм-аут происходит потому, что ваша программа ожидает открытого текста, в то время как судья этого не дает, потому что он исключает выход вашей программы сразу после предоставления нечисловой c клавиши.

Вы может использовать strtol(), который принимает указатель на указатель на символ и сохраняет позицию первого недопустимого символа.

Затем вы можете проверить, является ли ввод числовым c, проверив, если возвращаемый указатель указывает на завершающий нулевой символ.

char* p;
int k = (int)strtol (argv[1], &p, 10);
if (*p != '\0') {
    puts("non-numeric key");
    return 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...