C语言硬币计数程序scanf输入异常:penny后变量赋值错位问题求助
问题根因
你遇到的变量赋值偏移、空行问题完全是scanf格式串使用错误导致的,和变量内存分配无关,共有两处核心错误:
- 错误1:数字读取的
scanf格式串多写了\nscanf格式串中的任意空白字符(空格、\n、\t等)都会触发逻辑:跳过输入流中所有连续的空白字符,直到遇到第一个非空白字符才会结束匹配。你在%d后面加了\n,输入完数字敲回车后,scanf不会立即返回,而是会继续等待你输入下一个非空白字符,这就直接导致输入值和接收变量的顺序错位。 - 错误2:首字母读取的
%c没有忽略前置空白%c会原封不动读取输入流中的任意字符,包括你输入第一个首字母后敲的回车、两个首字母之间的空格,都会被当成middle、last的取值,不是你预期的用户输入的首字母。
修复方案
直接修改两处scanf的用法即可,不需要额外加虚拟填充变量:
- 把所有数字读取的
scanf格式串里的\n全部删掉 - 读取首字母的
%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
相关产品推荐
相关产品推荐

