c - 如果我的 scanf 变量是浮点数并且用户输入了一个字符,我该如何提示他们输入一个数字?假设 scanf 在 do while 循环内
问题描述
我曾尝试使用 k = getchar() 但它也不起作用;
这是我的代码
#include<stdio.h>
int main()
{
float height;
float k=0;
do
{
printf("please type a value..\n");
scanf("%f",&height);
k=height;
}while(k<0);// i assume letters and non positive numbers are below zero.
//so i want the loop to continue until one types a +ve float.
printf("%f",k);
return 0;
}
我想要一个如果用户输入字母或负数或字符,他/她应该被提示再次输入该值,直到他输入一个正数
解决方案
我一般不会使用scanf
-family 函数进行阅读stdin
。
fgets
更好,因为它将输入作为您指定长度的字符串,避免缓冲区溢出,您可以稍后将其解析为所需的类型(如果有)。对于float
值的情况,strtof
有效。
但是,如果您的可交付成果或家庭作业的规范要求使用scanf
with%f
作为格式说明符,您可以检查其返回值,该值将包含格式字符串中已成功扫描的格式说明符数量的计数:
§ 7.21.6.2:
如果在第一次转换(如果有)完成之前发生输入故障,[scanf] 函数将返回宏 EOF 的值。否则,该函数返回分配的输入项的数量,如果发生早期匹配失败,该数量可能少于提供的数量,甚至为零。
从那里,您可以诊断输入是否有效。此外,当scanf
失败时,stdin
不会清除,后续调用scanf
(即在循环中)将继续查看其中的任何内容。这个问题有一些关于处理这个问题的信息。
推荐阅读
- c++ - 使用宏定义打印格式参数
- php - 首先是什么:Wordpress 中的 wp_head 或 the_content 挂钩?
- html - svg 内联中断页面
- php - 使用什么:ROR 中的类或模块
- python - “对象没有属性”python中的错误
- c# - 将带有键的嵌套 JObject 反序列化为 List
- freebsd - Freebsd 11.1 上的 GlusterFS / 挂载问题
- c++ - 用于在一维数组上操作的嵌套 for 循环的正确 openmp 指令
- pandas - Pandas 值在不止一次出现时受到约束
- django - JWT token expire_delta 和 JWT Refresh Expiration Delta django jwt 的区别