使用scanf()检查C中的用户输入

使用scanf()检查C中的用户输入,c,if-statement,input,C,If Statement,Input,目的: 如果用户输入的b是一个float数字打印floor(b)、round(b)、ceil(b) Else打印扫描错误:(%d)\n 这个指令(由我们的老师提供)有这样一个代码,我不明白 这是我的密码: ` #包括 #包括 内部主(空){ 浮球b; printf(“输入浮点数”); int a=0; a=5; a=扫描频率(“%d”和&b); 如果(a=0) { printf(“扫描错误:(%d)\n”,a); } 其他的 { printf(“%g%g%g”,地板(b),圆形(b),天花板(b

目的:

如果用户输入的
b
是一个
float
数字打印
floor(b)、round(b)、ceil(b)

Else打印扫描错误:(%d)\n

这个指令(由我们的老师提供)有这样一个代码,我不明白

这是我的密码: `

#包括
#包括
内部主(空){
浮球b;
printf(“输入浮点数”);
int a=0;
a=5;
a=扫描频率(“%d”和&b);
如果(a=0)
{
printf(“扫描错误:(%d)\n”,a);
}
其他的
{
printf(“%g%g%g”,地板(b),圆形(b),天花板(b));
}
返回0
}
错误#1

if (a=0)  // condition will be always FALSE
一定是

if (a==0)
或者更好

if (0 == a)
错误#2

scanf("%d", &b); // when b is float
而不是

scanf("%f", &b);
更新:

实际上,为了检查
scanf
的结果,我个人更喜欢使用
=带有最后一次
scanf
输入的值数。例如,如果继续计算所需的两个逗号分隔的整数可以是:

int x, y;
int check;
do{
    printf("Enter x,y:");
    check = scanf("%d,%d", &x, &y); // enter format is x,y
    while(getchar()!='\n'); // clean the input buffer
}while(check != 2);
如果
check
不是
2
,即
0
(即使第一个值不正确,例如
abc,12
)或
1
(当用户忘记逗号或在逗号后不输入数字,例如
12,y
错误

if (a=0)  // condition will be always FALSE
一定是

if (a==0)
或者更好

if (0 == a)
错误#2

scanf("%d", &b); // when b is float
而不是

scanf("%f", &b);
更新:

实际上,对于检查
scanf
结果的情况,我个人更喜欢使用
!=
和最后一个
scanf
输入的值的数量。例如,如果继续计算需要两个逗号分隔的整数,则代码段可以是:

int x, y;
int check;
do{
    printf("Enter x,y:");
    check = scanf("%d,%d", &x, &y); // enter format is x,y
    while(getchar()!='\n'); // clean the input buffer
}while(check != 2);

如果
check
不是
2
,即
0
(即使第一个值不正确,例如
abc,12
)或
1
,则该循环将重新请求输入(当用户忘记逗号或在逗号后不输入数字时,例如,
12,y

带有更正和注释的代码-也可在此处获得-

#包括
#包括
内部主(空){
浮球b;
//printf(“输入浮点数”);
printf(“输入一个浮点数”);//纠正了打字错误
fflush(stdout);//将缓冲区发送到控制台,以便用户可以看到它
int a=0;
//a=5;--不需要
a=scanf(“%f”,&b);//有关读取浮动的信息,请参阅手册页
if(a==0)//需要比较运算符not assignemnt
{
printf(“scanf错误:(%d)\n”,a);//此处可以放置更好的错误消息
}
其他的
{
printf(“%g\n”,b);//只需使用ideone检查输入-调试
printf(“%g%g%g”,地板(b),圆形(b),天花板(b));
}
返回0;//此处需要分号
}
为了VenuKant Sahu的利益

返回值

这些函数返回成功匹配的输入项目数 和分配的,可以少于提供的数量,甚至可以为零 早期匹配失败的事件

如果在以下任一时间之前到达输入结束,则返回值EOF 发生第一次成功转换或匹配失败。EOF为 如果发生读取错误,也会返回,在这种情况下,错误 设置流的指示器(见ferror(3)),并设置errno 指出错误


带更正和注释的代码-也可在此处获得-

#包括
#包括
内部主(空){
浮球b;
//printf(“输入浮点数”);
printf(“输入一个浮点数”);//纠正了打字错误
fflush(stdout);//将缓冲区发送到控制台,以便用户可以看到它
int a=0;
//a=5;--不需要
a=scanf(“%f”,&b);//有关读取浮动的信息,请参阅手册页
if(a==0)//需要比较运算符not assignemnt
{
printf(“scanf错误:(%d)\n”,a);//此处可以放置更好的错误消息
}
其他的
{
printf(“%g\n”,b);//只需使用ideone检查输入-调试
printf(“%g%g%g”,地板(b),圆形(b),天花板(b));
}
返回0;//此处需要分号
}
为了VenuKant Sahu的利益

返回值

这些函数返回成功匹配的输入项目数 和分配的,可以少于提供的数量,甚至可以为零 早期匹配失败的事件

如果在以下任一时间之前到达输入结束,则返回值EOF 发生第一次成功转换或匹配失败。EOF为 如果发生读取错误,也会返回,在这种情况下,错误 设置流的指示器(见ferror(3)),并设置errno 指出错误


也许阅读这篇文章会有所帮助-你不能用“%d”来表示浮点。@EdHeal:也可以用
-Wall
(或等效的,取决于编译器)。GCC
-Wall
会同时出现
a=0
%d
错误。这条指令(由我们的老师提供)有这样的代码,我不理解。”-->询问老师。否则您就没有“老师”。另外,请纠正
Enter
的拼写。阅读此内容可能会有所帮助-您不能将“%d”用作浮点。@EdHeal:也可以使用
-Wall
编译(或等效工具,取决于编译器).GCC
-Wall
会同时发现
a=0
%d
错误。“指令(由我们的老师提供)有这样一个代码,我不明白。”——>问老师。否则你就没有“老师”。另外,请纠正
Enter
Yoda的拼写不好(现代编译器可能会发现这个问题)@EdHeal你已经证明了他的老师在标准的基础上是愚蠢的,但他不是因为他使用编译器而不只是阅读那些标准。为什么
0==a
a==0
好?
0==a
a==0
好,因为编译器在编译时发现错误
0=a
,但认为
a=0