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


    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;
    }
    
    hello
  • 相关阅读:
    关于binary log那些事
    Ubuntu常用软件安装与使用
    Ubuntu 12.04系统优化清理
    Ubuntu 12.04开机自动挂载Windows分区
    wubi安装Ubuntu后扩充Ubuntu系统空间
    sudo找不到命令:修改sudo的PATH路径
    JS 获取触发事件的对象
    NOIP 2002
    NOIP 2011 聪明的质监员
    NOIP 2011 计算系数
  • 原文地址:https://www.cnblogs.com/picksan/p/13492824.html
Copyright © 2020-2023  润新知