Как убедиться, что каждый символ аргумента команды является десятичным числом di git? - PullRequest
0 голосов
/ 29 мая 2020

Мы должны создать код, чтобы зашифровать шифр Цезаря. Один из шагов: вместо того, чтобы распечатать предоставленный аргумент командной строки, ваша программа вместо этого проверяет, является ли каждый символ этого аргумента командной строки десятичным числом di git (т.е. 0, 1, 2, et c.) И, если любой из них не является, завершается после печати сообщения Usage: ./caesar key. Но если аргумент состоит исключительно из символов di git, вы должны преобразовать эту строку (напомним, что argv - это массив строк, даже если эти строки выглядят как числа) в фактическое целое число и распечатать целое число , как через %i с printf. Код ниже - это то, что у меня есть, но он возвращает как Success, так и Error. Как я могу исправить это, чтобы программа проверяла, что каждый символ аргумента командной строки является di git? Код у меня

Ответы [ 3 ]

1 голос
/ 29 мая 2020

isdigit применяется к int, содержащему код символа, но выполняя isdigit(atoi(argv[1])), вы сначала пытаетесь преобразовать строку в целое число, поэтому это неправильно. Если вы используете isdigit, это повторяется по всей строке.

atoi молча возвращает 0, если аргумент не является допустимым целым числом, не используйте его.

Это не потому, что строка содержит только цифры, которым вы можете присвоить int, потому что число может быть слишком большим для int. Если вы принимаете отрицательное число, первым символом может быть -, а не di git. Один из способов как преобразовать, так и проверить всю строку, представляющую действительное целое число, - это использовать strtol, возвращающее long.

Из этого, когда argc не равно 2, вы должны прекратить выполнение, а не продолжить как и вы.

0 голосов
/ 29 мая 2020

Вы можете сделать это эффективно:

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

bool isNumber(char number[])
{
    int i = 0;

    if (strlen(number) == 0) // checks for empty string
        return false;

    if (strlen(number) == 1 && number[0] == '-') // checks for invalid str with negation sign
        return false;

    if (number[0] == '-') // verifies negation sign
        i = 1;

    for (; number[i] != 0; i++)
        if (!isdigit(number[i]))
            return false; // if not a number

    return true; // if number
}

int main(int argc, char *argv[]) {
    if (argc != 2) {
        printf("Usage: ./caesar key\n");
        return -1;
    }

    if (isNumber(argv[1]))
        printf("%d\n", atoi(argv[1])); // ... statements
    else
        printf("Usage: ./caesar key\n");

    return 0;
}

Вы можете безопасно использовать atoi() после проверки правильности данных аргументов. Рассмотрим:

if (isNumber(argv[1]))
    printf("Go on\n");
else
    printf("Usage: ./caesar key\n");

Пример вывода

$ ./caesar
Usage: ./caesar key
$ ./caesar s
Usage: ./caesar key
$ ./caesar 123 // --- right one
123
$ ./caesar s 3 f
Usage: ./caesar key
0 голосов
/ 29 мая 2020

Вот простой способ проверить, что все символы в строке находятся в заданном наборе:

#include <string.h>

int main(int argc, char *argv[]) {
    if (argc > 1) {
        if (strspn(argv[1], "0123456789") == strlen(argv[1]))
            printf("OK\n");
        else
            printf("Invalid characters\n");
    }
    return 0;
}

Вы можете проверить, что аргумент командной строки содержит хотя бы 1 символ.

...