- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在我正在编写的程序中,有一个对 scanf()
的调用,它读取一个存储钱的长十进制数。
do {
fflush(stdin);
printf("What is the number?\n");
} while (scanf("%Lf", &n.amt) == 0);
但是,在调试时,我看到 n.amt
等于 0。如果我输入 100
,为什么它显示读取的是零?起初,我使用的是 float
,我将其更改为 long double
,但问题仍然存在。
这一点也很明显,因为这个数据后来写入了一个文件,0也写入了那里。
最佳答案
当获取数字输入时,要防止空字符串 ([enter]) 或垃圾 输入而不导致您的 有点棘手使用 scanf
时,输入挂起 到空白行。以下代码将值作为字符串读取,并防止无输入 和垃圾输入 而不会挂起。仅当使用 strtod
有效转换为 double 值时才会继续(您可以将 strtold
替换为 long double):
#include <stdio.h>
#include <stdlib.h>
int main () {
char amount[50] = {0};
char *ep = NULL;
double n_amt = 0.0;
do {
/* protect against [enter] and garbage as input */
while (printf ("\nEnter the amount of money in the transaction: $ ") &&
scanf ("%49[^\n]%*c", amount) == 0 && getchar()) ;
/* convert to double */
n_amt = strtod (amount, &ep);
/* loop if no valid conversion */
} while ( &amount[0] == ep );
printf ("\n n.amt = %lf\n\n", n_amt);
return 0;
}
输出:
$ ./bin/scanf_double
Enter the amount of money in the transaction: $
Enter the amount of money in the transaction: $ lsdkfj
Enter the amount of money in the transaction: $ 123.45
n.amt = 123.450000
注意:您最好将钱作为整数值而不是 float 来处理。您也最好使用 fgets
或 getline
来读取 amount
而不是 scanf
,但是示例的目的是为了提供一个 scanf
解决方案。
使用 fgets
的等效输入
do {
printf ("\nEnter the amount of money in the transaction: $ ");
fgets (amount, MAXL, stdin);
n_amt = strtod (amount, &ep);
} while ( &amount[0] == ep );
关于c - `scanf` 读数为零,即使我输入了 100,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27629693/
我在将一些 C++ 代码转换为 Arduino 时遇到问题。任何帮助,将不胜感激。 编辑 我已经成功完成了上述操作。然而,现在唯一的问题是我的 Arduino 代码准确而正确地读取了电压,但没有其他寄
我需要能够从 HealthKit 读取所有 HRV 读数,并根据它们的创建日期对它们的值进行排序。 我可以使用 SampleQuery 从 HealthKit 读取特定时间间隔内的所有读数,如下所示:
我正在尝试使用 arduino uno R3 从 DHT-11 传感器读取温度和湿度 #include #include #define DHTPIN A3 #define DHTTYPE DHT
伙计们,我是 Meteor 的新手。对于我目前的应用程序,我正在使用 openlayer,因此对于 openlayer,我调用 Template.map.onRendered 事件,该事件将加载一个
我有一个设备可以读取电气设备的 kw 值,以测量它们在特定时间的(能量消耗率)。然后将这些值发送到轮询器(它定期向设备询问这些值),并插入到数据库中。 例子: 1st reading - 10 kw
我是一名优秀的程序员,十分优秀!