CLion建议使用'strtol'而不是'scanf'

时间:2018-06-11 09:55:24

标签: c clion

#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”,&amp; num);

Clang-Tidy:'scanf'用于将字符串转换为整数值,但函数不会报告转换错误;考虑使用'strtol'代替

我用CLion写了一个非常简单的代码,它推荐我'strtol'而不是'scanf'。

但我只使用整数变量而且没有字符串。我无法弄清楚为什么弹出检查信息。

如何修改此代码?

1 个答案:

答案 0 :(得分:1)

  

如何修改此代码?

#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_MAXLONG_MIN   的价值。如果不支持base的值,strtol()   返回0

     

如果失败strtol()将errno设置为以下值之一:

     

错误代码:

     

EINVAL 不支持base的值。

     

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

可能偏离主题但是,Jonathan Leffler在他的评论中(在另一个主题中)说处理警告就像错误一样。