我只需要读取正数(unsigned long long
),没有更多,所以我使用scanf("%llu", &num);
。但它也允许输入负值
在这种情况下如何验证正数?用户必须在 [0..2 ^(64)-1] 中输入正数,但他可能会错过并在同一时间间隔内输入负值。但我无法声明long long
变量来检查它,因为它可以完全包含 2 ^ 64 - 1 。
答案 0 :(得分:2)
使用fgets()
将数字作为字符串阅读,然后对其进行验证,例如与strchr()
。最后使用strtoull()
将字符串转换为数字,如果数字超出范围,则会失败:
如果读取的值超出a的可表示值范围 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
答案 1 :(得分:1)
您可以使用fgets()
将输入读入字符数组,检查第一个字符 是否为数字以外的字符,然后使用{{ 1}}将其转换为-
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");
}
中的%*[ ]
用于忽略字符串中的前导空格。
找到第一个非空格字符并将其存储在sscanf()
中,其值将被选中。
正如here所解释的那样,c
会修剪两边的字符串sscanf(buff, "%s", buff);
以摆脱空格。