gpt4 book ai didi

c - `scanf` 读数为零,即使我输入了 100

转载 作者:太空宇宙 更新时间:2023-11-04 02:45:42 25 4
gpt4 key购买 nike

在我正在编写的程序中,有一个对 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 来处理。您也最好使用 fgetsgetline 来读取 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com