猿问

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

检查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)

但这些都没有奏效。

有任何想法吗?


小怪兽爱吃肉
浏览 694回答 3
3回答

弑天下

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");

慕哥6287543

您需要先将输入作为字符串读取,然后解析字符串以查看它是否包含有效的数字字符。如果是,那么您可以将其转换为整数。char&nbsp;s[MAX_LINE];valid&nbsp;=&nbsp;FALSE;fgets(s,&nbsp;sizeof(s),&nbsp;stdin);len&nbsp;=&nbsp;strlen(s);while&nbsp;(len&nbsp;>&nbsp;0&nbsp;&&&nbsp;isspace(s[len&nbsp;-&nbsp;1])) &nbsp;&nbsp;&nbsp;&nbsp;len--;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;strip&nbsp;trailing&nbsp;newline&nbsp;or&nbsp;other&nbsp;white&nbsp;space &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(len&nbsp;>&nbsp;0){ &nbsp;&nbsp;&nbsp;&nbsp;valid&nbsp;=&nbsp;TRUE; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;len;&nbsp;++i) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!isdigit(s[i])) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;valid&nbsp;=&nbsp;FALSE; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}

莫回无

有几个问题与使用scanf与%d转换说明这样做:如果输入字符串以有效整数(例如“12abc”)开头,则“12”将从输入流中读取并转换并分配给num,并scanf返回1,因此您将指示成功(可能) )不应该;如果输入字符串不以数字开头,则scanf不会读取输入流中的任何字符,num也不会更改,返回值将为0;您没有指定是否需要处理非十进制格式,但如果必须处理八进制或十六进制格式(0x1a)的整数值,则不起作用。该%i转换说明处理十进制,八和十六进制格式,但你仍然有前两个问题。首先,您需要将输入读取为字符串(最好使用fgets)。如果您不被允许使用atoi,您可能不允许使用它们strtol。所以你需要检查字符串中的每个字符。检查数字值的安全方法是使用isdigit库函数(还有用于分别检查八进制和十六进制数字的函数isodigit和isxdigit函数),例如while&nbsp;(*input&nbsp;&&&nbsp;isdigit(*input)) &nbsp;&nbsp;&nbsp;input++;(如果你甚至不被允许使用isdigit,isodigit或者isxdigit,那么请你的老师/教授打电话让他们的任务比实际需要的更难)。如果您需要能够处理八进制或十六进制格式,那么它会变得更复杂一些。C约定是八进制格式具有前导0数字,十六进制格式具有前导0x。因此,如果第一个非空白字符为0,则必须先检查下一个字符,然后才能知道要使用哪种非十进制格式。基本概要是如果第一个非空白字符不是' - ','+','0'或非零十进制数字,那么这不是一个有效的整数字符串;如果第一个非空白字符是' - ',那么这是一个负值,否则我们假设一个正值;如果第一个字符是'+',那么这是一个正值;如果第一个非空白字符和非符号字符是非零十进制数字,则输入为十进制格式,您将用于isdigit检查剩余字符;如果第一个非空白字符和非符号字符为'0',则输入为八进制或十六进制格式;如果第一个非空白字符和非符号字符是'0'而下一个字符是从'0'到'7'的数字,那么输入是八进制格式,你将isodigit用来检查剩余的字符;如果第一个非空格和非符号字符为0且第二个字符为x或X,则输入为十六进制格式,您将用于isxdigit检查剩余字符;如果任何剩余字符不满足上面指定的检查功能,则这不是有效的整数字符串。
随时随地看视频慕课网APP
我要回答