C - 控制溢出(从键盘插入值)
C - Control the Overflow (Insertion of values from the keyboard)
我试图限制用户向其添加最小值和最大值:
int verificate( int num, int min, int max) {
while( (num > max) || (num < min) ) {
printf("\tBig number try again:");
scanf(" %d",&num);
}
return num;
}
Main.c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MIN 0
#define MAX INT_MAX
void main() {
int num1;
scanf(" %d",&num1);
num1=verificate(num1,MIN,MAX);
printf("Number = %d",num1);
}
我遇到的问题是,如果用户自动插入一个更大的数字 (num1>2147483647)
结果是 1410065407
,如果用户自动插入最大的负值 (num1=-999999999999)
结果是 -1215752191
。
有什么办法可以控制这个吗?并让用户再次插入值?
scanf()
整数转换溢出的行为未定义。
使用fgets()
读取所有输入。沟 scanf()
.
使用strtol()
解析字符串:更好的错误处理和溢出检测。
#include <errno.h>
#include <stdio.h>
// return true when good
// return false on EOF
bool verificate(int *dest, int min, int max) {
char buf[80];
while (fgets(buf, sizeof buf, stdin)) {
char *endptr;
errno = 0;
long num = strtol(buf, &endptr, 0);
// numeric input? overflow? >= min? <= max?
if (endptr > buf && errno != ERANGE && num >= min && num <= max) {
*dest = (int) num;
return true;
}
printf("\tNon-numeric input or out of %d %d range:\n", min, max);
}
return false;
}
示例用法
#define MIN 0
#define MAX INT_MAX
int main() {
int num1 = 0;
if (verificate(&num1, MIN, MAX) {
printf("Number = %d",num1);
}
}
我试图限制用户向其添加最小值和最大值:
int verificate( int num, int min, int max) {
while( (num > max) || (num < min) ) {
printf("\tBig number try again:");
scanf(" %d",&num);
}
return num;
}
Main.c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MIN 0
#define MAX INT_MAX
void main() {
int num1;
scanf(" %d",&num1);
num1=verificate(num1,MIN,MAX);
printf("Number = %d",num1);
}
我遇到的问题是,如果用户自动插入一个更大的数字 (num1>2147483647)
结果是 1410065407
,如果用户自动插入最大的负值 (num1=-999999999999)
结果是 -1215752191
。
有什么办法可以控制这个吗?并让用户再次插入值?
scanf()
整数转换溢出的行为未定义。
使用fgets()
读取所有输入。沟 scanf()
.
使用strtol()
解析字符串:更好的错误处理和溢出检测。
#include <errno.h>
#include <stdio.h>
// return true when good
// return false on EOF
bool verificate(int *dest, int min, int max) {
char buf[80];
while (fgets(buf, sizeof buf, stdin)) {
char *endptr;
errno = 0;
long num = strtol(buf, &endptr, 0);
// numeric input? overflow? >= min? <= max?
if (endptr > buf && errno != ERANGE && num >= min && num <= max) {
*dest = (int) num;
return true;
}
printf("\tNon-numeric input or out of %d %d range:\n", min, max);
}
return false;
}
示例用法
#define MIN 0
#define MAX INT_MAX
int main() {
int num1 = 0;
if (verificate(&num1, MIN, MAX) {
printf("Number = %d",num1);
}
}