C语言中float变量相乘结果返回0的技术求助
问题原因及修复方案
核心问题1:计算时机错误
你在定义costem1、costem2、costem3时直接用credit1、credit2、credit3计算,但此时这些变量还未通过scanf获取用户输入,内存里是未初始化的垃圾值(你看到结果为0只是巧合)。必须在输入完所有credit变量之后再执行乘法计算。
核心问题2:scanf格式符不匹配
credit1、credit2、credit3是float类型,但你用了%lf格式符(这是给double类型用的),会导致输入值无法正确存入变量,进而计算出错。应该改用%f格式符。
额外问题:fgets与scanf混用的换行残留
fgets会读取输入的换行符并存入name数组,后续scanf读取姓氏时可能会被这个换行符干扰,导致读取失败。可以在fgets之后处理掉换行符,或者调整输入顺序。
修复后的代码:
#include <stdio.h> #include <string.h> // 用于strcspn函数处理换行符 int main(){ char name[50]; char apellido1[20]; char apellido2[20]; int age; float credit1; float credit2; float credit3; // 先完成所有输入操作 printf("Introduzca su nombre utilizando hasta 50 carácteres\n"); fgets(name, sizeof name, stdin); // 去掉fgets读取的换行符 name[strcspn(name, "\n")] = '\0'; printf("Introduzca sus apellidos utilizando hasta 20 carácteres por apellido\n"); scanf("%s%s", apellido1, apellido2); // 数组名本身就是地址,不需要& printf("Introduzca su edad\n"); scanf("%d", &age); printf("Introduzca sus créditos en la matrícula\n"); scanf("%f%f%f", &credit1, &credit2, &credit3); // float用%f格式符 // 输入完成后再计算 double costem1 = credit1 * 15.45; double costem2 = credit2 * (15.45 * 1.25); double costem3 = credit3 * (15.45 * 1.5); // 原代码里costem3误用了credit2,这里修正 printf("%lf\n%lf\n%lf", costem1, costem2, costem3); return 0; }
关键修复点说明:
- 把
costem系列变量的计算代码移到scanf读取credit变量之后,确保使用的是用户输入的有效值。 - 将
scanf读取float的格式符从%lf改为%f,匹配变量类型。 - 修正了
costem3的计算错误(原代码里误用credit2,应该是credit3)。 - 处理了
fgets读取的换行符,避免干扰后续scanf操作。 - 数组名本身就是指向首元素的指针,
scanf读取字符串时不需要加&(原代码里的&name、&apellido1不符合规范)。
内容的提问来源于stack exchange,提问作者dza205
相关产品推荐
相关产品推荐

