CLion рекомендует использовать 'strtol' вместо 'scanf' - PullRequest
0 голосов
/ 11 июня 2018
#include <stdio.h>

int main(int argc, char** argv) {
    int num = 0;

    printf("Input: ");
    scanf("%d", &num); <<<

    printf("%d\n", num);

    return 0;
}

scanf ("% d", & num);

Clang-Tidy: 'scanf' используется для преобразования строки в целочисленное значение, но функцияне будет сообщать об ошибках конвертации;рассмотрите возможность использования 'strtol' вместо


Я написал очень простой код с CLion, и он рекомендует мне использовать 'strtol' вместо 'scanf'.

Но я используютолько целочисленная переменная и нет строк.Я не могу понять, почему всплывает инспекционное сообщение.

Как мне изменить этот код?

1 Ответ

0 голосов
/ 11 июня 2018

Как изменить этот код?

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>

enum { INPUT_SIZE = 30 };

int main () {
    char *ptr;
    long ret;
    char str[INPUT_SIZE];

    fgets(str, INPUT_SIZE, stdin);    
    ret = strtol(str, &ptr, 10);

    if( ret == LONG_MAX || ret == LONG_MIN ) {
        perror("!! Problem is -> ");
    }
    else if (ret) {
        printf("The number is %ld\n", ret);
    }
    else {
        printf("No number found input is -> %s\n", ptr);
    }

    return(0);
}

В случае успеха strtol() возвращает преобразованное значение типа long int.

В случае неудачи,strtol() возвращает 0, если преобразование не может быть выполнено.Если правильное значение находится за пределами диапазона представимых значений, strtol() возвращает LONG_MAX или LONG_MIN в соответствии со знаком значения.Если значение base не поддерживается, strtol() возвращает 0.

В случае неудачи strtol() устанавливает для errno одно из следующих значений:

Коды ошибок:

EINVAL Значение базы не поддерживается.

ERANGE Преобразование вызвало переполнение.Источник: IBM

Можно ли проверить переполнение, например, с помощью scanf()?

Input:  1234 stackoverflow
Output: The number is 1234

Input:  123nowhitespace
Output: The number is 123

Input:  number is 123
Output: No number found input is -> number is 123

Input:  between123between
Output: No number found input is -> between23between

Input:  9999999999999999999
Output: !! Problem is -> : Result too large

Может быть, не по теме, но, Джонатан Леффлер говорит в своих комментариях (в других темах), что обрабатывает предупреждения как ошибки.

...