scanf_s和scanf函数读取数值时需要消除空白字符的方法

在C语言编程中,使用scanf_s或scanf读取数值后,输入队列可能会残留换行符,影响后续输入。本文介绍了两种解决方法:一是使用额外的字符输入函数如getchar()清除换行符;二是直接在scanf函数中处理。这是C Primer Plus第八章课后习题的一个常见问题,通过实例代码和详细解释帮助读者理解并解决这一问题。

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
腊月二十,还未回家。假期三周,年前一周,年后两周!!!刚把得!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值