我只需要读取一个正数 ( unsigned long long
),什么都没有,所以我使用scanf("%llu", &num);
. 但它也允许输入负值。
在这种情况下如何验证正数?用户必须在[0..2^(64)-1]中输入一个正数,但他可能会错过并在相同的间隔内输入一个负值。但是我不能声明一个long long
变量来检查它,因为它可以完全包含2^64 - 1。
问问题
668 次
2 回答
2
用 读取数字作为字符串fgets()
,然后验证它,例如用strchr()
。最后用于strtoull()
将字符串转换为数字,如果数字超出范围将失败:
如果读取的值超出了 unsigned long long int 的可表示值范围,则函数返回 ULLONG_MAX(定义在 中
<limits.h>
),并errno
设置为ERANGE
。
例子:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void) {
char str[100]=;
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = '\0';
if(strchr(str, '-') == NULL) {
printf("Not a negative number\n");
unsigned long long number = strtoull (str, NULL, 10);
printf("%llu\n", number);
} else {
printf("Negative number\n");
}
return 0;
}
输出:
Not a negative number
12343566
对于 -12343566,它给出:
Negative number
于 2017-09-28T18:01:01.093 回答
1
您可以使用 将输入读入字符数组fgets()
,检查第一个字符是否是,而不是数字,然后使用-
ve 符号strtoull()
将其转换为unsigned long long
.
char c, buff[100];
fgets(buff, sizeof(buff), stdin);
//sscanf(buff, "%*[ ]%c", &c);
sscanf(buff, "%s", buff);
//if( (c<'0' || c>'9') )
if(buff[0]<'0' || buff[0]>'9')
{
printf("\nNegative or invalid number!");
}
else
{
num=strtoull(buff, NULL, 10);
}
strtoull()
如果它返回ULLONG_MAX
的limits.h
值不errno
适合.ERANGE
errno.h
unsigned long long
if(num==ULLONG_MAX && errno==ERANGE)
{
printf("\nOverflow");
}
%*[ ]
in用于忽略字符串中的sscanf()
前导空格。第一个非空格字符被找到并存储在c
其值被检查的地方。
正如这里所解释的,将修剪两边sscanf(buff, "%s", buff);
的字符串以消除空格。buff
于 2017-09-28T17:57:47.240 回答