Visual Studio输入float时第二个scanf被跳过问题求助
问题成因及修复建议
首先贴出你的代码:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main(void) { float value1, value2; double returnValue; /* declaring the output of lollygag*/ /*declares the values that will be filled with user input*/ printf("Enter a decimal value: "); scanf(" %f ", &value1); printf("Enter the second decimal value: "); scanf(" %f ", &value2); lollygag(value1, value2); /*calling the lollygag fuction in order to preform the operation*/ printf(" %f ", returnValue); /*displays our final answer*/ } float lollygag(returnValue, value1, value2) { if (value1==0 || value2==0) /*tests to see if one of the values is 0*/ { return -1.0; } else /* if neither value is 0 it will preform the operation*/ { returnValue = value1 / value2; /*redefines retrunValue with our solution*/ } return returnValue; }
核心问题:scanf格式串末尾的空格
第二个scanf被跳过的根源,是你写的scanf(" %f ", &value1);格式串末尾的空格。
scanf对格式串中的空白字符(空格、换行、制表符)的处理逻辑是:匹配输入中任意数量的空白字符(包括零个),直到遇到非空白字符才停止。
当你输入float类型数值(比如3.14)并按下回车后,输入缓冲区会留下3.14\n。第一个scanf读取完3.14后,会继续处理格式串末尾的空格——它会跳过缓冲区里的换行符\n,但此时还在等待下一个非空白字符。这时候你以为第一个输入已经完成,程序的执行流程却被第一个scanf卡住,直到你输入新的非空白字符,而这部分输入会被第二个scanf直接读取,看起来就像第二个scanf被“跳过”了。
为什么输入int类型时看似正常?因为int类型输入没有小数点,输入后按下回车,第一个scanf处理末尾空格时跳过换行,第二个scanf的格式串开头空格也会跳过空白,刚好等待你的输入,这个过程的卡顿不明显,让你误以为正常,但实际上这也是不符合预期的行为。
修复方法
把两个scanf格式串末尾的空格去掉,改成"%f"或者" %f"(开头的空格可以保留,用来跳过输入前的空白,比如换行):
scanf("%f", &value1); // 或者 scanf(" %f", &value1);
额外代码问题(顺便修复)
你的代码还有几个会导致编译或运行错误的问题:
- 函数声明缺失:
lollygag在main中调用前没有声明,编译器会默认它返回int类型,和实际的float返回类型冲突,需要在main前添加声明:float lollygag(float value1, float value2); - 函数参数类型缺失:
lollygag的参数没有指定类型,这是老式C写法,现代编译器会报错,需明确参数类型:float lollygag(float value1, float value2) { // 函数逻辑 } - 返回值未赋值:
main中的returnValue没有接收lollygag的返回值,需修改为:returnValue = lollygag(value1, value2); - 函数逻辑冗余:不需要把
returnValue作为参数,直接在函数内计算返回值即可:float lollygag(float value1, float value2) { if (value1 == 0 || value2 == 0) { return -1.0f; // 用float字面量-1.0f更匹配返回类型 } return value1 / value2; }
内容的提问来源于stack exchange,提问作者Travis Entner
相关产品推荐
相关产品推荐

