#include<stdio.h>
#include "MarcroDefine.h"
// Print out selection menus and verify the validity of input.
int Option(void) {
int ret ,status;
printf("%s%s\n", STAR, STAR);
printf("Please Enter a Number to Select Aimed Function:(Enter \"q\" to Quit) \n");
printf("(1) Compare the Value of Two Float, Return the Smaller one \n");
printf("(2) Print a Character from a Chosed Range. \n");
printf("(3) Print a Matrix of a Specific Character. \n");
printf("(4) Calculate Harmonic Mean. \n");
printf("(5) Redefine Two Float With the Larger Value of Them. \n");
printf("(6) Quit\n");
printf("%s%s\n", STAR, STAR);
while ((status = scanf("%d", &ret)) != 1 || ret > 6 || ret < 1) { //正确
/* 错误 while (status = (scanf("%d", &ret)) != 1 || ret > 6 || ret < 1)
只有用以下语句时才正确运行,否则会无限循环 printf("Please Enter a Number Between 1 and 6.\n");这一句
if (status != 1)
getchar();
scanf("%*s");
原因:while (status = (scanf("%d", &ret)) != 1 || ret > 6 || ret < 1)运行步骤
① scanf读入值
② 对比, 当输入非法时 scanf()的值不等于1,所以这里的对比结果一定是 ture,结果是1
③ 把1赋值给status = 1
结果是此时不会执行 scanf("%*s"); 输入的非法值保留在缓冲区,会永久触发循环。
之所以加了getchar()之后程序能正常,是因为加入语句后scanf("%*s")不是选择运行,而是必定运行,而本语句只会忽略%s字符串
所以碰到合法输入的类型时不会把合法输入的%d给忽略。
scanf("%*s"); 这句话其实不用加if也行。
*/
if (status != 1)
scanf("%*s"); // *在scanf里表示滞后赋值的意思,所以这里的 %*s 把留在缓冲区的非整型部分当做字符串忽略,直到下次
// 有合法的值输入为止。
printf("Please Enter a Number Between 1 and 6.\n");
}
return ret;
}
只是为了记录错误。
【错误记录】一个括号打错引发的惨案 C的运算符次序和输入机制笔记
最新推荐文章于 2023-11-26 14:51:51 发布