为了账号安全,请及时绑定邮箱和手机立即绑定

检查C中的输入是否为整数类型

检查C中的输入是否为整数类型

C
小怪兽爱吃肉 2019-08-13 09:57:36
检查C中的输入是否为整数类型问题是我不能使用atoi或任何其他类似的功能(我很确定我们应该依赖于数学运算)。 int num;   scanf("%d",&num);  if(/* num is not integer */) {   printf("enter integer");   return;  }我试过了:(num*2)/2 == num num%1==0if(scanf("%d",&num)!=1)但这些都没有奏效。有任何想法吗?
查看完整描述

3 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

num将始终包含一个整数,因为它是一个整数int。您的代码的真正问题是您不检查scanf返回值。scanf返回成功读取的项目数,因此在这种情况下,它必须返回1表示有效值。如果没有,则输入无效的整数值,并且num变量可能没有被更改(即仍然具有任意值,因为您没有初始化它)。

在评论中,您只想允许用户输入一个整数,然后输入回车键。不幸的是,这不能简单地实现scanf("%d\n"),但这是一个诀窍:

int num;char term;if(scanf("%d%c", &num, &term) != 2 || term != '\n')
    printf("failure\n");else
    printf("valid integer followed by enter key\n");


查看完整回答
反对 回复 2019-08-13
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

您需要先将输入作为字符串读取,然后解析字符串以查看它是否包含有效的数字字符。如果是,那么您可以将其转换为整数。

char s[MAX_LINE];valid = FALSE;fgets(s, sizeof(s), stdin);len = strlen(s);while (len > 0 && isspace(s[len - 1]))
    len--;     // strip trailing newline or other white space
    if (len > 0){
    valid = TRUE;
    for (i = 0; i < len; ++i)
    {
        if (!isdigit(s[i]))
        {
            valid = FALSE;
            break;
        }
    }}


查看完整回答
反对 回复 2019-08-13
?
莫回无

TA贡献1865条经验 获得超7个赞

有几个问题与使用scanf%d转换说明这样做:

  1. 如果输入字符串以有效整数(例如“12abc”)开头,则“12”将从输入流中读取并转换并分配给num,并scanf返回1,因此您将指示成功(可能) )不应该;

  2. 如果输入字符串以数字开头,则scanf不会读取输入流中的任何字符,num也不会更改,返回值将为0;

  3. 您没有指定是否需要处理非十进制格式,但如果必须处理八进制或十六进制格式(0x1a)的整数值,则不起作用。该%i转换说明处理十进制,八和十六进制格式,但你仍然有前两个问题。

首先,您需要将输入读取为字符串(最好使用fgets)。如果您不被允许使用atoi,您可能不允许使用它们strtol。所以你需要检查字符串中的每个字符。检查数字值的安全方法是使用isdigit库函数(还有用于分别检查八进制和十六进制数字的函数isodigitisxdigit函数),例如

while (*input && isdigit(*input))
   input++;

(如果你甚至不被允许使用isdigitisodigit或者isxdigit,那么请你的老师/教授打电话让他们的任务比实际需要的更难)。

如果您需要能够处理八进制或十六进制格式,那么它会变得更复杂一些。C约定是八进制格式具有前导0数字,十六进制格式具有前导0x。因此,如果第一个非空白字符为0,则必须先检查下一个字符,然后才能知道要使用哪种非十进制格式。

基本概要是

  1. 如果第一个非空白字符不是' - ','+','0'或非零十进制数字,那么这不是一个有效的整数字符串;

  2. 如果第一个非空白字符是' - ',那么这是一个负值,否则我们假设一个正值;

  3. 如果第一个字符是'+',那么这是一个正值;

  4. 如果第一个非空白字符和非符号字符是非零十进制数字,则输入为十进制格式,您将用于isdigit检查剩余字符;

  5. 如果第一个非空白字符和非符号字符为'0',则输入为八进制或十六进制格式;

  6. 如果第一个非空白字符和非符号字符是'0'而下一个字符是从'0'到'7'的数字,那么输入是八进制格式,你将isodigit用来检查剩余的字符;

  7. 如果第一个非空格和非符号字符为0且第二个字符为xX,则输入为十六进制格式,您将用于isxdigit检查剩余字符;

  8. 如果任何剩余字符不满足上面指定的检查功能,则这不是有效的整数字符串。


查看完整回答
反对 回复 2019-08-13
  • 3 回答
  • 0 关注
  • 693 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信