【发布时间】:2012-02-24 22:27:00
【问题描述】:
我有这段代码,它使用 scanf 读取一个整数,并通过查看缓冲区来检查它是否真的是一个整数。
int e_1;
char c[1];
// noNeedToCleanBuffer is used to avoid buffer cleaning the first time.
int noNeedToCleanBuffer = 1;
do {
// Clears the buffer.
if (!noNeedToCleanBuffer)
while ((c[0] = getchar()) != '\n') ;
noNeedToCleanBuffer = 0;
printf("Input an integer value: \n");
e_1 = scanf("%d", &n);
c[0] = getchar();
} while ((e_1 != 1 && c[0] != 10) || (e_1 == 1 && c[0] != 10));
但是我不知道如何检查输入是否在 INT_MIN 和 INT_MAX 之间(我从 limits.h 中得到这些)。
我正在考虑将数字作为字符串并将其与表示 INT_MIN 和 INT_MAX 的两个字符串进行比较,但是由于我使用的是标准 c99,因此不允许使用 atoi() 或 itoa()。
【问题讨论】:
-
您可以使用
strtol()等,在 C99 中.. -
mkssoftware.com/docs/man3/strtol.3.asp 这会将其转换为 long int 而不是 int。还是谢谢
-
long有什么问题?然后您可以轻松地检查long与INT_MIN和INT_MAX,因为longs 总是大于(或等于)ints,您可以使用strtol()进行错误处理以防万一甚至不适合long的东西。另外,请注意atoi()(但不是itoa())在 C99 中,但它不进行错误检查。 -
long 大于 int 取决于我运行程序的机器。所以我不能依赖它。
-
不,
long大于或等于int在 all 符合实现。2 <= sizeof(int) <= 4 <= sizeof(long)。这是由标准保证的(实际上,IIRC 标准以位而不是字节指定它,但这与本次讨论无关)。所以你可以便携地使用这种方法。