C语言
输入输出
读取数据的最大位数
scanf("%2d",&n);//读取最大2位整数,后面的截断
scanf("%10s",str);//读取最大10位字符
刷新缓冲区的三种方法
scanf("%*[^
]");scanf("%*c");//使缓冲区溢出,清空
fflush(stdin);//刷新缓冲区 不是很通用
scanf的高级用法
匹配特定字符
scanf("%[abcd]");//只读取字符abcd,顺序不固定,遇到其他字符结束
%[a-z] 读取abc...xyz范围内的字符
%[A-Z] 读取所有大写字母
%[0-9] 读取所有的数字
%[a-zA-Z0-9] 读取所有小写字母,大写字母,数字
不匹配特定字符串
%[^
] 表示匹配除换行符以外的所有字符,遇到换行符停止
%[^0-9] 表示匹配除数字以外的所有字符,遇到十进制数字停止
丢弃读取到的字符
%*d //表示读取一个整数并丢弃
scanf("%*d %d",&n);
总结
%{*}{width}type
type表示读取什么类型数据,例如%d,%s,%[a-z],%[^a-z];type类型必须有
width表示读取最大宽度,可有可无
*表示丢弃读到的数据,可有可无
输入密码小程序
//passward.c
#include<stdio.h>
#include<conio.h>
#include<ctype.h>
#define PWDLEN 20
void getpwd(char *pwd,int pwdlen);
int main()
{
char pwd[PWDLEN+1];
printf("input passward:");
getpwd(pwd,PWDLEN);
printf("your passward is:%s
",pwd);
return 0;
}
/**
获取用户输入的密码
@param pwd char* 保存密码的内存首地址
@param pwdlen int 密码的最大长度
*/
void getpwd(char *pwd,int pwdlen)
{
char ch=0;
int i=0;
while(i<pwdlen){
ch=getch();//无回显,无缓存,立即输出,区别于getchar()
//用户按下回车 gech()读取到
getchar()读取到
if(ch=='
'){//回车结束输入
printf("
");
break;
}
if(ch=='' && i>0){//按下删除键
i--;//字符数组中的元素并未被删除,后续输入时会被覆盖 bug
printf(" ");//退格 输出空格 退格
}else if(isprint(ch)){//是打印字符
pwd[i]=ch;
i++;
printf("*");
}
}
pwd[i]=0; //字符串结束符
}
阻塞式循环监听
#include <stdio.h>
#include <conio.h>
//conio.h 为windows特有头文件
int main(){
char ch;
int i=0;
while(ch=getch()){//getch() 无回显 getche() 有回显
if(ch==27){
break;
}else{
printf("Number:%d
",++i);
}
}
return 0;
}
非阻塞式循环监听
#include <stdio.h>
#include <conio.h>
#include <windows.h>
int main(){
char ch;
int i=0;
//循环监听,知道esc退出
while(1){
if(kbhit()){//检查缓冲区中是否有数据
ch=getch();//将缓冲区中数据以字符形式读出
if(ch==27) {
break;
}
}
printf("Number:%d
",++i);
Sleep(1000);//暂停1秒
//有小问题 sleep期间按esc无效
}//while
return 0;
}