#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'。
但我只使用整数变量而且没有字符串。我无法弄清楚为什么弹出检查信息。
如何修改此代码?
答案 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_MAX
或LONG_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在他的评论中(在另一个主题中)说处理警告就像错误一样。