C语言重拾之旅:不易察觉的“\n”的问题

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

int main()
{
int ret = 0;

char password[20] = { 0 };
printf("请输入密码:");

scanf("%s", password);

printf("请确认(Y/N):");
	
ret = getchar();

if (ret == 'Y')
{
	printf("确认成功\n");

}

else
{
	printf("放弃确认\n");

	return 0;
}

}

这是一个实验性的代码,没有什么实际的意义,但问题是:

在我们输入“密码”的时候,例如:123456
程序就会自动生成“放弃确认”,跳过了中间“(Y/N)”的确定。请添加图片描述
其原因就是当我们输入“123456”后敲击的回车键,在缓存区就会留下

“123456\n”,scanf将“123456”存入password缓存区内就是剩下一个“\n”

之后getchar()会将“\n”赋给ret,就不会在让你手动舒服Y/N

if判断中“\n”不等于‘Y’,就自然而然输出“放弃确认”。

起初一个比较容易的解决办法就是在scanf语句后再加入一个“getchar();”
就可以帮我们把“\n”读走,也就不影响之后手动输入“Y/N”进行判断了

但这个方法有个缺陷,例如密码输入:123456 asd
但scanf只会读取空格前的字符串,getchar()这次把空格读走了

但后面仍然存在“asd\n”,所以最后依旧会直接输出“放弃确认”。
请添加图片描述
目前本人能力内解决办法就是通过以下这个循环

while ((ch = getchar()) != '\n')
{
	;
}

前提是记得声明 ch这个变量 int ch = 0;
循环内将“ asd\n”等字符逐一确认,直到“\n”后循环结束。

最终代码:

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

int main()
{
int ret = 0;
int ch = 0;

char password[20] = { 0 };
printf("请输入密码:");

scanf("%s", password);

while ((ch = getchar()) != '\n')
{
	;
}

printf("请确认(Y/N):");

ret = getchar();

if (ret == 'Y')
{
	printf("确认成功\n");
}

else
{
	printf("放弃确认\n");
}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值