使用scanf读取double类型时输入字符为何返回垃圾值而非0.00?
问题描述
当使用scanf("%lf", &Deposit_Amount);读取存款金额时,输入字符(如'g')后,double类型变量Deposit_Amount并未被设置为0.00,而是输出垃圾值(例如一串极大的数字)。
完整代码片段:
double Deposit_Amount; StartDepositInput:; system("cls"); printf("Enter amount to deposit: "); scanf("%lf", &Deposit_Amount); // 输入'g'时 fflush(stdin); printf("%lf", Deposit_Amount); // 输出一串极大的垃圾值
疑问:scanf在输入非有效double类型值时,难道不应该将变量值设为0.00吗?
解答
scanf的行为完全符合C标准规定:当输入与格式说明符不匹配时,它不会修改目标变量的值,也不会自动将其设为0。
- 当你输入'g'时,
%lf格式要求读取浮点数,但输入的字符无法被解析为有效浮点数,此时scanf会立即停止处理,目标变量Deposit_Amount会保留它之前的垃圾值——因为你没有初始化这个变量,它的初始值是内存里的随机数据,所以输出的就是这堆随机值转成double后的结果。 - 另外注意:
fflush(stdin)是未定义行为,标准C里不允许对输入流使用fflush,不同编译器可能有不同表现,不要依赖这个写法。
如果要处理无效输入并确保变量有合理值,你需要:
- 初始化变量:比如定义时写
double Deposit_Amount = 0.0;,这样即使scanf失败,变量也有初始值0。 - 检查scanf的返回值:
scanf会返回成功读取的参数个数,比如用if(scanf("%lf", &Deposit_Amount) != 1)来判断输入是否有效,失败时可以重置变量为0,并清空输入缓冲区里的无效字符(可以用循环读取直到换行来实现)。
示例修正代码:
#include <stdio.h> #include <stdlib.h> int main() { double Deposit_Amount = 0.0; int c; StartDepositInput: system("cls"); printf("Enter amount to deposit: "); // 检查scanf是否成功读取一个double值 if(scanf("%lf", &Deposit_Amount) != 1) { // 重置变量为0 Deposit_Amount = 0.0; // 清空输入缓冲区的无效字符,避免影响下一次输入 while((c = getchar()) != '\n' && c != EOF); } printf("%.2lf\n", Deposit_Amount); goto StartDepositInput; return 0; }
内容的提问来源于stack exchange,提问作者markcalendario
相关产品推荐
相关产品推荐

