Scanf功能测试

时间:2017-03-04 09:36:45

标签: c while-loop scanf

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.15scanf只读取数字2,然后成功关闭循环。

2 个答案:

答案 0 :(得分:2)

%d基本上与strtol的作用相同:它丢弃空格,然后读取数字,直到遇到第一个非数字字符,并将读取的数字转换为整数值。如果已经读取了至少一个数字,则无论“停止阅读”的字符是什么,转换都被视为成功。

因此,在您的情况下,.是非数字字符,但2已被读取,因此转换仅使用字符串"2"并成功。

要解决此问题,您需要首先考虑允许哪些字符结束整数(显然,.不在其中)。然后读取字符,直到遇到其中一个字符并将所有内容转换为strtol

答案 1 :(得分:1)

Scanf执行您要求的操作:它从输入流中读取一个整数,并忽略其余无法解释为int的内容。

如果你想进行输入过滤,如果你把整行读成一个字符串(例如使用fgets),解析输入并采取相应的行动,那么它最好。