You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 00:30:22