当scanf
成功转换请求格式的输入字符时(在本例中,是十进制整数"%d"
),它返回一个1
表示“转换成功”。
好吧,恐怕我理解不对。
我想使用这个特性立即过滤输入:如果输入不是整数(正数或负数),则请求另一个输入。
#include<stdio.h>
#include<stdlib.h>
int main(){
int x;
printf("\nThis function reads an integer\n");
while(scanf("%d", &x) != 1){
printf("Please type an integer:\n");
scanf("%d", &x);
}
printf("\n%d is really an integer!\n", x);
return 0;
}
但在这种情况下,输入
2.15
,scanf
只读取数字2
,然后成功关闭循环。 最佳答案
%d
的工作原理与strtol
基本相同:它丢弃空白,然后读取数字,直到遇到第一个非数字字符,并将读取的数字转换为整数值。如果至少读取了一个数字,则转换将被视为成功,无论“停止读取”的字符是什么。
因此,在您的情况下.
是一个非数字字符,但2
已被读取,因此转换仅使用字符串"2"
并成功。
要解决这个问题,首先需要考虑允许哪些字符结束整数(.
显然不在其中)。然后读取字符,直到遇到其中一个字符,然后用strtol
转换所有读取的内容。