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; }
可是事实上却是:
原因:
还有个疑问就是:为什么scanf不读取'\n'?回车是为了按,为了触发,为了把在控制台输入的东西,放到缓冲区里面,让scanf去读取,才按的回车,回车不是密码的内容
'\n'--回车都是密码吗?不是
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;
}
确认成功:
确认失败:
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;
}
原因:
修改:
#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') 这个位置可以换成其它字符,意思是读到这个元素就不读取了
3.3关于scanf的读取问题3️⃣
scanf默认是读取到空格就结束了
#include<stdio.h> int main() { char arr[20] = {0}; scanf("%s", arr); printf("%s\n", arr); return 0; }
执行:
但是如果写成这样:
意思是一直往后面读取,直到遇到'\n',
#include<stdio.h>
int main()
{
char arr[20] = {0};
scanf("%[^\n]", arr);//[^]这里面可以换成其它字符,但是换的那个最终要在缓冲区那里得放 //进去那个字符,'\0'就挺难的
return 0;
}
执行:
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; }
输出:
注意这里:
\0读取的时候把'\'输出跳过,然后直接输出'0'
控制台的每一个输入都是字符,只是看它是什么类型
这里有的是数字类型的字符,其实就是数字的意思
4.2图解(也可以作为查找)
只打印红色框里面的字符
这个表也可以供参考使用。欢迎大佬补充!