C(十一)scanf、getchar(第三弹)

问题引入:如何实现输入一串密码,如:"123 xxxx" ,然后读取并确认,是 -- Y;否 -- N。

自然的,我们想到用scanf,但是在使用过程中你是否遇到跟我一样的困惑呢?如下:

打印的和输入的不一样???!!!

这就不禁让我们思考:scanf到底是怎么读取数据的?

其实,当我们输入"123 xxxx"时,我们都会敲一下空格键,对不对?

那么,这个时候,我们就向缓冲区输入了

而scanf不读取"空格"、"\n",所以scanf只会把123(隐含'\0')读走。

我们可以通过以下例子说明输入数据时还向缓冲区输入了'\n'👉

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
    char mi_ma[20] = { 0 };
    printf("输入密码:>");
    scanf("%s", mi_ma);
    printf("请确认密码(Y/N):>"); //Y -- Yes ;N -- No
    int ch = 0;
    ch = getchar(); //打算用getchar读取单个字符,即Y或N
    if (ch == 'Y')
    {
        printf("确认成功\n");
    }
    else
    {
        printf("确认失败\n");
    }
    return 0;
}

运行结果👉

cpp 复制代码
输入密码:>1234
请确认密码(Y/N):>确认失败

都还没输入Y/N,直接就显示"确认失败"?!!!

------------这是因为getchar读取的是'\n',而还不及读取Y/N。

改进如下:👉

tip:ch之所以定义为整型,是因为getchar()的返回值为对应字符的ASCII码值。

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
    char mi_ma[20] = { 0 };
    printf("输入密码:>");
    scanf("%s", mi_ma);
    getchar();             //用来清除'\n'
    printf("请确认密码(Y/N):>"); //Y -- Yes ;N -- No
    int ch = 0;
    ch = getchar(); //打算用getchar读取单个字符,即Y或N
    if (ch == 'Y')
    {
        printf("确认成功\n");
    }
    else
    {
        printf("确认失败\n");
    }
    return 0;
}

运行结果👉

cpp 复制代码
输入密码:>1234
请确认密码(Y/N):>Y
确认成功

回到一开始的问题👉

问题引入:如何实现输入一串密码,如:"123 xxxx" ,然后读取并确认,是 -- Y;否 -- N。

认识到 scanf不读取"空格"、"\n"之后,又因为getchar()读取单个字符,所以我们不妨用多次getchar()读取"从空格到'\n'之间的部分"。题解之一如下:👉

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
    char mi_ma[20] = { 0 };
    printf("输入密码:>");
    scanf("%s", mi_ma);
    while (getchar() != '\n')
    {
        ;
    }
    printf("请确认密码(Y/N):>"); //Y -- Yes ;N -- No
    int ch = 0;
    ch = getchar(); //打算用getchar读取单个字符,即Y或N
    if (ch == 'Y')
    {
        printf("确认成功\n");
    }
    else
    {
        printf("确认失败\n");
    }
    return 0;
}

运行结果👉

cpp 复制代码
输入密码:>123 xxxx
请确认密码(Y/N):>Y
确认成功
相关推荐
水饺编程11 小时前
Windows 命令行:cd 命令3,当前目录,父目录,根目录
c语言·c++·windows·visual studio
kyle~11 小时前
C/C++---动态内存管理(new delete)
c语言·开发语言·c++
Yuki’12 小时前
网络编程---UDP
c语言·网络·网络协议·udp
.YM.Z13 小时前
C语言——文件操作
c语言·文件操作
GanGuaGua13 小时前
Linux系统:线程的互斥和安全
linux·运维·服务器·c语言·c++·安全
神里流~霜灭16 小时前
(C++)数据结构初阶(顺序表的实现)
linux·c语言·数据结构·c++·算法·顺序表·单链表
草莓熊Lotso18 小时前
【C++】递归与迭代:两种编程范式的对比与实践
c语言·开发语言·c++·经验分享·笔记·其他
鹿鹿学长1 天前
2025年全国大学生数学建模竞赛(C题) 建模解析|婴儿染色体数学建模|小鹿学长带队指引全代码文章与思路
c语言·开发语言·数学建模
伴杯猫1 天前
【ESP32-IDF】基础外设开发2:系统中断矩阵
c语言·单片机·嵌入式硬件·mcu·物联网·github
Want5951 天前
C/C++圣诞树①
c语言·开发语言·c++