C语言中二维double数组的int/float输入及范围校验问题修复
C语言二维数组输入校验问题修复与初学者方案
原代码失效原因
输入2183812748347这类超出int范围的数值时程序未终止,核心问题是强制类型转换的未定义行为:
当double值超出int范围时,(int)a[i][j]的转换结果是C标准未规定的,可能得到一个被截断的、落在int范围内的错误值,导致(int)a[i][j] > INT_MAX永远无法触发。
另外,原代码直接写-3.402823e+38不够严谨,建议用<float.h>头文件中的FLT_MAX和-FLT_MAX(FLT_MIN是最小正浮点数,负向最小值为-FLT_MAX)匹配float的标准范围。
原代码修复方案
正确校验int范围
不要用强制转换判断,直接通过double值本身和INT_MIN/INT_MAX比较,同时验证数值是整数(因为int只能存储整数):
#include <stdio.h> #include <stdlib.h> #include <limits.h> #include <float.h> #include <math.h> int main() { int n = 2; // 可自行修改数组大小 double a[n][n]; printf("Enter Elements (Row-wise):\n"); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (scanf("%lf", &a[i][j]) != 1) { printf("-1"); exit(1); } // 判断是否为合法int:数值在int范围且是整数 int valid_int = (a[i][j] >= INT_MIN && a[i][j] <= INT_MAX && a[i][j] == floor(a[i][j])); // 判断是否为合法float:数值在float范围 int valid_float = (a[i][j] >= -FLT_MAX && a[i][j] <= FLT_MAX); // 既不是合法int也不是合法float则终止 if (!valid_int && !valid_float) { printf("-1"); exit(1); } } } // 后续逻辑 return 0; }
编译时注意链接数学库(如GCC加-lm参数),因为用到了floor()函数。
初学者友好的简化方案
如果觉得浮点判断太绕,推荐用字符串读取+类型判断的方式,逻辑更直观,也避免浮点转换的坑:
实现思路
- 用字符数组读取输入的原始字符串
- 判断字符串是整数还是浮点数
- 整数用
strtoll()转换为长整型,校验是否在int范围内 - 浮点数用
strtod()转换为双精度,校验是否在float范围内 - 不合法则输出
-1并终止
示例代码
#include <stdio.h> #include <stdlib.h> #include <limits.h> #include <float.h> #include <ctype.h> // 判断字符串是否为整数(仅含数字、正负号) int is_integer(const char *str) { if (*str == '-' || *str == '+') str++; if (*str == '\0') return 0; // 仅符号不算有效整数 while (*str != '\0') { if (!isdigit(*str)) return 0; str++; } return 1; } int main() { int n = 2; double a[n][n]; printf("Enter Elements (Row-wise):\n"); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { char buf[100]; if (scanf("%s", buf) != 1) { printf("-1"); exit(1); } if (is_integer(buf)) { long long val = strtoll(buf, NULL, 10); if (val < INT_MIN || val > INT_MAX) { printf("-1"); exit(1); } a[i][j] = (double)val; } else { double val = strtod(buf, NULL); if (val < -FLT_MAX || val > FLT_MAX) { printf("-1"); exit(1); } a[i][j] = val; } } } // 测试输出 printf("Valid elements:\n"); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { printf("%.2lf ", a[i][j]); } printf("\n"); } return 0; }
这个方案步骤清晰,每一步的判断逻辑都容易理解,适合新手学习调试。
内容的提问来源于stack exchange,提问作者Min Archie
相关产品推荐
相关产品推荐

