当scanf
成功转换请求格式的输入字符时(在本例中为十进制整数"%d"
),它会返回1
含义"转换成功&# 34。
好吧,我担心我没弄错。
我想使用此功能立即过滤输入:如果输入不是整数(正数或负数),则会请求另一个输入。
#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
,然后成功关闭循环。
答案 0 :(得分:2)
%d
基本上与strtol
的作用相同:它丢弃空格,然后读取数字,直到遇到第一个非数字字符,并将读取的数字转换为整数值。如果已经读取了至少一个数字,则无论“停止阅读”的字符是什么,转换都被视为成功。
因此,在您的情况下,.
是非数字字符,但2
已被读取,因此转换仅使用字符串"2"
并成功。
要解决此问题,您需要首先考虑允许哪些字符结束整数(显然,.
不在其中)。然后读取字符,直到遇到其中一个字符并将所有内容转换为strtol
。
答案 1 :(得分:1)
Scanf
执行您要求的操作:它从输入流中读取一个整数,并忽略其余无法解释为int
的内容。
如果你想进行输入过滤,如果你把整行读成一个字符串(例如使用fgets
),解析输入并采取相应的行动,那么它最好。