getchar、putchar以及输入缓冲区(下)

简介: getchar、putchar以及输入缓冲区(下)

3.输入密码

预测的可能结果:printf("请输入密码:>");之后输入字符,输入完之后,打印printf("请输入密码(Y/N):>");之后选择输入'Y'或者非'Y'的字符,打印确认成功或者确认失败

#include<stdio.h>
int main()
{
  printf("请输入密码:>");
  char password[20] = { 0 };
  scanf("%s", password);
  printf("请输入密码(Y/N):>");
  int ch = getchar();
  if (ch == 'Y')
  {
    printf("确认成功\n");
  }
  else
  {
    printf("确认失败\n");
  }
  return 0;
}

可是事实上却是:

d02236fd3e5747b2a3c6ddd5617fad5d.png

原因:

还有个疑问就是:为什么scanf不读取'\n'?回车是为了按,为了触发,为了把在控制台输入的东西,放到缓冲区里面,让scanf去读取,才按的回车,回车不是密码的内容

'\n'--回车都是密码吗?不是

2a021a2caa5f44b086c9cc99231f9fc0.png


3.1调用一次getchar读取相当于"吸收掉该字符"1️⃣

修改:

int main()

{

   printf("请输入密码:>");

   char password[20] = { 0 };

   scanf("%s", password);

   getchar();//处理'\n' -->加上这个位置才不会让程序发生错误

   printf("请输入密码(Y/N):>");

   int ch = getchar();

   if (ch == 'Y')

   {

       printf("确认成功\n");

   }

   else

   {

       printf("确认失败\n");

   }

   return 0;

}


确认成功:

0a2c39c337274fc4890b23bd7dd72c17.png

确认失败:

058fa466c790444296733b610f6d3208.png


3.2多个字符且字符之间有空格2️⃣

注意:“回车”和空格也是字符

同样是上面修改之后的程序,输入以下字符串,会发生错误

int main()

{

   printf("请输入密码:>");

   char password[20] = { 0 };

   scanf("%s", password);

   getchar();//处理'\n' -->加上这个位置才不会让程序发生错误

   printf("请输入密码(Y/N):>");

   int ch = getchar();

   if (ch == 'Y')

   {

       printf("确认成功\n");

   }

   else

   {

       printf("确认失败\n");

   }

   return 0;

}

35ed1ee2134548388420addc84d01d9e.png

原因:

aa8ce0df05484626b048d6c5d421b8a4.png

修改:

#include<stdio.h>
int main()
{
  printf("请输入密码:>");
  char password[20] = { 0 };
  scanf("%s", password);
  //清理缓冲区
  while (getchar() != '\n')//读取了也不用,不接受返回值,不存储元素,只是让它清理一下
  {
    ;
  }
  printf("请确认密码(Y/N):>");
  int ch = getchar();
  if (ch == 'Y')
  {
    printf("确认成功\n");
  }
  else
  {
    printf("确认失败\n");
  }
  return 0;
}


注意:

while (getchar() != '\n') 这个位置可以换成其它字符,意思是读到这个元素就不读取了

c0b5c285c49e4461a9d0e007c069bcee.png


3.3关于scanf的读取问题3️⃣

scanf默认是读取到空格就结束了

#include<stdio.h>
int main()
{
  char arr[20] = {0};
  scanf("%s", arr);
  printf("%s\n", arr);
  return 0;
}


执行:

417a05e9b9c14a24bb408feee162e9b8.png

但是如果写成这样:

意思是一直往后面读取,直到遇到'\n',

#include<stdio.h>

int main()

{

   char arr[20] = {0};

   scanf("%[^\n]", arr);//[^]这里面可以换成其它字符,但是换的那个最终要在缓冲区那里得放                                    //进去那个字符,'\0'就挺难的

   return 0;

}


执行:

4b7d1879cfab4f949188236060891c4a.png


4.ASCLL码表


4.1只打印数字字符的代码:

#include <stdio.h>
int main()
{
    char ch = '\0';
 while ((ch = getchar()) != EOF)
 {
     if (ch < '0'|| ch > '9')//这段代码的意思是在这个范围内的都不打印
        continue;
     putchar(ch);
 }
 return 0;
}


输出:

6a9421a5bd724bc1bef159cd3b38045c.png

注意这里:

\0读取的时候把'\'输出跳过,然后直接输出'0'

控制台的每一个输入都是字符,只是看它是什么类型

a0f8ec924bdc4daca69a33f2d42350b3.png

这里有的是数字类型的字符,其实就是数字的意思


4.2图解(也可以作为查找)

只打印红色框里面的字符

5814fb3fdd89486c9ba14a513ae9b62f.png

这个表也可以供参考使用。欢迎大佬补充!

相关文章
|
8天前
putchar()函数
【6月更文挑战第24天】putchar()函数。
9 2
|
8天前
|
C语言
用getchar和putchar读/写字符
用getchar和putchar读/写字符
7 0
|
2月前
getchar()&putchar()函数
getchar()&putchar()函数。
18 1
|
11月前
scanf和getchar区别
scanf和getchar区别
135 0
|
9月前
getchar() & putchar() 函数
getchar() & putchar() 函数。
119 2
|
9月前
getchar、putchar以及输入缓冲区(上)
getchar、putchar以及输入缓冲区(上)
|
数据安全/隐私保护
getchar()与putchar()函数详解
getchar与putchar其实最基本的作用就是用getchar读取一个字符,再用putchar输出一个字符
135 0
|
C语言
论Scanf、Gets、Getchar的区别
论Scanf、Gets、Getchar的区别
141 0
当后面有 fgets()/gets()/scanf() 时 scanf() 出现问题
首先让我们来考虑下面用 C 编写的简单程序。该程序使用 scanf() 读取一个整数,然后使用 fgets() 读取一个字符串。
43 0
C 中的 scanf() 和 fscanf() – 简单而强大
如何只读取我们需要的一部分输入?例如,考虑一些仅包含字符后跟整数或浮点数的输入流。我们只需要扫描那个整数或浮点数。
66 0