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

C语言硬币计数程序scanf输入异常:penny后变量赋值错位问题求助

问题根因

你遇到的变量赋值偏移、空行问题完全是scanf格式串使用错误导致的,和变量内存分配无关,共有两处核心错误:

  • 错误1:数字读取的scanf格式串多写了\n
    scanf格式串中的任意空白字符(空格、\n、\t等)都会触发逻辑:跳过输入流中所有连续的空白字符,直到遇到第一个非空白字符才会结束匹配。你在%d后面加了\n,输入完数字敲回车后,scanf不会立即返回,而是会继续等待你输入下一个非空白字符,这就直接导致输入值和接收变量的顺序错位。
  • 错误2:首字母读取的%c没有忽略前置空白
    %c会原封不动读取输入流中的任意字符,包括你输入第一个首字母后敲的回车、两个首字母之间的空格,都会被当成middle、last的取值,不是你预期的用户输入的首字母。

修复方案

直接修改两处scanf的用法即可,不需要额外加虚拟填充变量:

  1. 把所有数字读取的scanf格式串里的\n全部删掉
  2. 读取首字母的%c前面加一个空格,让scanf自动跳过输入流中残留的空白字符

另外你代码中计算totalpennies时有个小隐患:sum是整型,直接除以整型100会触发整数除法舍去小数位,改成除以100.0就能得到正确的浮点结果。

修复后完整代码

#include <stdio.h>

int main()
{
    char first, middle, last, yes;
    int quarter, dime, nickel, penny, quarvalue, dimevalue, nickelvalue, pennyvalue, sum, nothing;
    float totalpennies;

    printf ("Hello, please enter your initials ");
    // 格式串开头加空格,忽略前置空白
    scanf (" %c", &first);
    scanf (" %c", &middle);
    scanf (" %c", &last);

    printf ("Welcome %c", first);
    printf (".%c", middle);
    printf (".%c.", last);

    printf ("\nEnter number of pennies:");
    // 去掉格式串里的\n
    scanf ("%d", &penny);

    printf ("Enter number of nickels:");
    scanf ("%d", &nickel);

    printf ("Enter number of dimes:");
    scanf ("%d", &dime);

    printf ("Enter number of quarters:");
    scanf ("%d", &quarter);

    printf ("\nnumber of pennies is %d", penny);
    printf ("\nnumber of nickels is %d", nickel);
    printf ("\nnumber of dimes is %d", dime);
    printf ("\nnumber of quarters is %d\n", quarter);

    sum = (25 * quarter) + (10 * dime) + (5 * nickel) + penny;
    totalpennies = sum/100.0; 

    printf ("\nyour coins are worth:%d 美分,合计 %.2f 美元",sum, totalpennies);

    return 0;
}

内容的提问来源于stack exchange,提问作者Codeman129

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:36:01