c primer plus第八章课后习题第8道
编写程序,显示提供一个加减乘除法的菜单。

题主在做这题的时侯忽略了一个问题:

scanf在读取数值后会把换行符留在输入队列,下次调用函数就会返回这个换行符,导致我们不希望的行为。
解决方法:

第一种方法:

第二种方法:
在包含scanf函数中清理换行符!!!!!

课后习题代码(每个人有每个人的思路,所以答案不唯一)
#include <stdio.h>
#include <ctype.h>
char get_first(void);
char get_choice(void);
float input_num(int n);
int main(void){
char choice;
float n1, n2, n3;
while ((choice = get_choice()) != 'q')
{
if (choice == '\n')continue;
switch (choice)
{
case 'a':
n1 = input_num(0);
n2 = input_num(1);
n3 = n1 + n2;
printf("%f + %f = %f \n", n1, n2, n3);
break;
case 's':
n1 = input_num(0);
n2 = input_num(1);
n3 = n1 - n2;
printf("%f - %f = %f \n", n1, n2, n3);
break;
case 'm':
n1 = input_num(0);
n2 = input_num(1);
n3 = n1 * n2;
printf("%f * %f = %f \n", n1, n2, n3);
break;
case 'd':
n1 = input_num(0);
n2 = input_num(1);
while(n2 == 0.0)
{
printf("enter a number other than 0:\n");
n2 = input_num(1);
}
n3 = n1 / n2;
printf("%f / %f = %f \n", n1, n2, n3);
break;
default:printf("please respond with a,s,m,d:\n");
break;
}
}
printf("thank you using this system.\n");
getchar();
return 0;
}
char get_first(void){
int ch;
while (1)
{
ch = getchar();
if (ch != ' ' && ch != '\t' && ch != '\n') break;//非空白字符退出循环。
}
while (getchar() != '\n');
// continue;//其实这个continue没什么意义。上面加一个分号就好。
return ch;
}
float input_num(int n){
float num;
char chnum;
if (!n)
printf("enter first num:");
else
printf("enter second num:");
while (scanf_s("%f", &num)!=1)
{
while ((chnum=getchar())!='\n')
putchar(chnum);
printf(" is not an number.\n");
printf("please enter a number,such as 2.5,-1.78,or 3.0:");
}
//while (getchar() != '\n')/*这才是重点*/
// continue;
return num;
}
char get_choice(void){
char ch;
printf("enter the operation of your choice:\n");
printf("a.add s.substract\n");
printf("m.multiply d.divide\n");
printf("q.quit\n");
ch = get_first();
while (ch != 'a' && ch != 's' && ch != 'm' && ch != 'd'
&& ch != 'q')
{
ch = get_first();
}
return ch;
}
书籍整理内容:
最近在看C primer plus(加深巩固自己的C语言技巧,为以后学习C++打个基础)。
里面知识针对自己以后要查的点整理出来。
使用工具:visual studio 2013
第二、三章内容:https://blog.youkuaiyun.com/answerMack/article/details/103766020
第四章内容:https://blog.youkuaiyun.com/answerMack/article/details/103805900
第五章内容:https://blog.youkuaiyun.com/answerMack/article/details/103855794
第六章内容:https://blog.youkuaiyun.com/answerMack/article/details/103870182
第七章内容:https://blog.youkuaiyun.com/answerMack/article/details/103891048
第八章内容:https://blog.youkuaiyun.com/answerMack/article/details/103953376
2020-01-14
腊月二十,还未回家。假期三周,年前一周,年后两周!!!刚把得!!!
在C语言编程中,使用scanf_s或scanf读取数值后,输入队列可能会残留换行符,影响后续输入。本文介绍了两种解决方法:一是使用额外的字符输入函数如getchar()清除换行符;二是直接在scanf函数中处理。这是C Primer Plus第八章课后习题的一个常见问题,通过实例代码和详细解释帮助读者理解并解决这一问题。

被折叠的 条评论
为什么被折叠?



