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

Gal*_*Gal 33 c integer input

问题是,我不能使用atoi或任何其他类似的功能(我很确定我们应该依赖于数学运算).

 int num; 
 scanf("%d",&num);
 if(/* num is not integer */) {
  printf("enter integer");
  return;
 }
Run Code Online (Sandbox Code Playgroud)

我试过了:

(num*2)/2 == num
num%1==0
if(scanf("%d",&num)!=1)
Run Code Online (Sandbox Code Playgroud)

但这些都没有奏效.

有任何想法吗?

And*_*Dog 39

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");
Run Code Online (Sandbox Code Playgroud)


Pau*_*l R 24

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

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请不要建议使用危险的`gets()`. (14认同)
  • @sombe您确实需要这样做,但是在检查它是否有效之后,您需要添加一个`sscanf(s, "%d", num);`,它将从中生成一个整数。 (2认同)
  • @sombe,你能告诉我们实际的要求吗?我的猜测是你应该处理字符串 - >十进制转换(这就是我写作的方式) (2认同)

Joh*_*ode 14

有几个问题与使用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++;    
Run Code Online (Sandbox Code Playgroud)

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

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

基本概要是

  1. 如果第一个非空白字符不是' - ','+','0'或非零十进制数字,那么这不是一个有效的整数字符串;
  2. 如果第一个非空白字符是' - ',那么这是一个负值,否则我们假设一个正值;
  3. 如果第一个字符是'+',那么这是一个正值;
  4. 如果第一个非空白字符和非符号字符是非零十进制数字,则输入为十进制格式,您将用于isdigit检查剩余字符;
  5. 如果第一个非空白字符和非符号字符为'0',则输入为八进制或十六进制格式;
  6. 如果第一个非空白字符和非符号字符是'0'而下一个字符是从'0'到'7'的数字,那么输入是八进制格式,你将isodigit用来检查剩余的字符;
  7. 如果第一个非空白字符和非符号字符为0且第二个字符为xX,则输入为十六进制格式,您将用于isxdigit检查剩余字符;
  8. 如果任何剩余字符不满足上面指定的检查功能,则这不是有效的整数字符串.


abe*_*nky 5

首先问自己你将如何以往任何时候都希望这个代码返回一个整数:

int num; 
scanf("%d",&num);
Run Code Online (Sandbox Code Playgroud)

您将变量指定为整数类型,然后您scanf,但适用于整数 ( %d)。

在这一点上,它还可能包含什么?