问题是,我不能使用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)
Joh*_*ode 14
有几个问题与使用scanf与%d转换说明这样做:
如果输入字符串以有效整数(例如"12abc")开头,则"12"将从输入流中读取并转换并分配给num,并scanf返回1,因此您将指示成功(可能) )不应该;
如果输入字符串不以数字开头,则scanf不会读取输入流中的任何字符,num也不会更改,返回值将为0;
您没有指定是否需要处理非十进制格式,但如果必须处理八进制或十六进制格式(0x1a)的整数值,则不起作用.该%i转换说明处理十进制,八和十六进制格式,但你仍然有前两个问题.
首先,您需要将输入读取为字符串(最好使用fgets).如果您不被允许使用atoi,您可能不允许使用它们strtol.所以你需要检查字符串中的每个字符.检查数字值的安全方法是使用isdigit库函数(还有用于分别检查八进制和十六进制数字的函数isodigit和isxdigit函数),例如
while (*input && isdigit(*input))
input++;
Run Code Online (Sandbox Code Playgroud)
(如果你甚至不被允许使用isdigit,isodigit或者isxdigit,那么请你的老师/教授打电话让他们的任务比实际需要的更难).
如果您需要能够处理八进制或十六进制格式,那么它会变得更复杂一些.C约定是八进制格式具有前导0数字,十六进制格式具有前导0x.因此,如果第一个非空白字符为0,则必须先检查下一个字符,然后才能知道要使用哪种非十进制格式.
基本概要是
isdigit检查剩余字符;isodigit用来检查剩余的字符;x或X,则输入为十六进制格式,您将用于isxdigit检查剩余字符;首先问自己你将如何以往任何时候都希望这个代码不返回一个整数:
int num;
scanf("%d",&num);
Run Code Online (Sandbox Code Playgroud)
您将变量指定为整数类型,然后您scanf,但仅适用于整数 ( %d)。
在这一点上,它还可能包含什么?