如何检查输入的数字是正数?

时间:2017-09-28 17:27:24

标签: c validation io numbers unsigned-long-long-int

我只需要读取正数(unsigned long long),没有更多,所以我使用scanf("%llu", &num);。但它也允许输入负值 在这种情况下如何验证正数?用户必须在 [0..2 ^(64)-1] 中输入正数,但他可能会错过并在同一时间间隔内输入负值。但我无法声明long long变量来检查它,因为它可以完全包含 2 ^ 64 - 1

2 个答案:

答案 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()将输入读入字符数组,检查第一个字符 - ve符号是否为数字以外的字符,然后使用{{ 1}}将其转换为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);以摆脱空格。