c语言 输入 用scanf 实现 gets的效果

C语言

输入输出

读取数据的最大位数

scanf("%2d",&n);//读取最大2位整数,后面的截断
scanf("%10s",str);//读取最大10位字符

刷新缓冲区的三种方法

scanf("%*[^\n]");scanf("%*c");//使缓冲区溢出,清空 
fflush(stdin);//刷新缓冲区 不是很通用 

scanf的高级用法

匹配特定字符

scanf("%[abcd]");//只读取字符abcd,顺序不固定,遇到其他字符结束
%[a-z]	读取abc...xyz范围内的字符

%[A-Z]	读取所有大写字母

%[0-9]	读取所有的数字

%[a-zA-Z0-9]	读取所有小写字母,大写字母,数字

不匹配特定字符串

%[^\n] 表示匹配除换行符以外的所有字符,遇到换行符停止
%[^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\n",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()读取到\r getchar()读取到\n
		if(ch=='\r'){//回车结束输入 
			printf("\n");
			break;
		}
		if(ch=='\b' && i>0){//按下删除键 
			i--;//字符数组中的元素并未被删除,后续输入时会被覆盖 bug
			printf("\b \b");//退格 输出空格 退格
		}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\n",++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\n",++i);
		Sleep(1000);//暂停1秒	
		//有小问题 sleep期间按esc无效 
	}//while
	return 0;
}
posted @ 2020-08-12 20:33  当浮一大白<  阅读(451)  评论(0编辑  收藏  举报