Если нет аргументов int / long, не выводите сумму - PullRequest
0 голосов
/ 01 марта 2019

Мне было интересно, можно ли было определить, не было ли аргументов командной строки int / long, а затем распечатать только сообщение об ошибке, а не сумму, равную 0.В приведенном ниже коде, если введенные аргументы командной строки ./sum abc, он выведет сообщение об ошибке abc, не являющееся целым числом, а затем выведет 0 для суммы, которую я не хочу.

Но все равно такая команда, как ./sum 1 3 abc 4, должна работать и выводить сумму, равную 8, а также сообщение об ошибке для abc.

Единственное, о чем я могу подумать, это если суммаравно 0, то не распечатывать.Но что, если сумма чисел равна нулю?

int main(int argc, char *argv[])
{
    long sum = 0;
    if(argc > 1){
        long i;
        char *ptr;
        char *endptr;
        for(i = 1; argv[i] != NULL; ++i){
            sum += strtol(argv[i], &endptr, 10);
            if(*endptr != '\0'){
                fprintf(stderr, "error: argument %s is not an int\n", argv[i]);
                continue;
            }
        }


    }else{
        printf("no input received");
    }

    printf("%ld is sum\n", sum);
    return 0;
}

Токовый выход

error: argument abc is not an int
0

Желаемый выход

error: argument abc is not an int

1 Ответ

0 голосов
/ 01 марта 2019

Установите флаг, если вы найдете какие-либо действительные числа.Запустите false и, если strtol() успешно, установите флаг на true.Печатайте только сумму в конце, если она true.

#include <stdbool.h>

int main(int argc, char *argv[])
{
    long sum = 0;
    bool any_valid = false;

    if(argc > 1){
        long i;
        char *ptr;
        char *endptr;
        for(i = 1; argv[i] != NULL; ++i){
            sum += strtol(argv[i], &endptr, 10);
            if(*endptr == '\0'){
                any_valid = true;
            }
            else {
                fprintf(stderr, "error: argument %s is not an int\n", argv[i]);
            }
        }
    }else{
        printf("no input received");
    }

    if(any_valid) {
        printf("%ld is sum\n", sum);
    }
    return 0;
}

. Это имеет приятное преимущество - не печатать сумму, если не было получено ни одного числа.Также я избавился от оператора continue;: он вам не нужен в конце цикла;это подразумевается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...