【笔记】C_scanf的一些高级用法以及非阻塞输入

本文介绍了C语言中scanf函数的一些高级用法,包括指定长度输入、限定范围数据读取、丢弃已读取数据,并详细讲解了如何实现非阻塞输入,利用kbhit()函数检测输入缓冲区状态,实现更灵活的用户交互。

1.scanf指定长度输入

#include <stdio.h>

int main(){
	int a;
	float b;
	char str[30];
	scanf("%2d",&a);
	scanf("%*[^\n]");scanf("%*c");
	scanf("%6f",&b);
	scanf("%*[^\n]");scanf("%*c");
	scanf("%5s",str);
	printf("a=%d,\nb=%f,\nstr=%s\n",a,b,str);
	return 0;
}

输入:

1000
45.45645
abcdefghij

输出:

a=10,
b=45.4564,
str=abcde

2.scanf输入指定范围数据

#include <stdio.h>
#pragma warning(disable:4996)

int main() {
	char str1[30];
	char str2[30];
	char str3[30];
	char str4[30];
	scanf("str1=%[abc]",str1);   //只读取abc
	scanf("%*[^\n]"); scanf("%*c");
	scanf("str2=%[a-z]", str2);  //读取a-z范围
	scanf("%*[^\n]"); scanf("%*c");
	scanf("str3=%[a-z0-9]", str3);  //读取a-z和0-9范围
	scanf("%*[^\n]"); scanf("%*c");
	scanf("str4=%[^456]", str4);    //读取除456外范围内,清除缓存同理,清除所有除\n外数据
	printf("str1=%s\nstr2=%s\nstr3=%s\nstr4=%s", str1,str2,str3,str4);
	return 0;
}

输入:

str1=acbffdhbc
str2=acbvZDJHGJzx
str3=dfa345545ASDF123
str4=fafjha123456

输出:

str1=acb
str2=acbv
str3=dfa345545
str4=fafjha123

但是这里会发现,当读取的数据不在范围内会直接停止赋值。

3.scanf丢弃读取到的数据

#include <stdio.h>
#pragma warning(disable:4996)

int main() {
	int a;
	char str[30];
	scanf("%*d %d", &a);
	scanf("%*[a-z]");
	scanf("%[^\n]", str);
	printf("a=%d,str=%s\n", a, str);
	return 0;
}

输入:

1000 12312addfsdfSAFF

输出:

a=12312,str=SAFF

4.非阻塞输入

#include <stdio.h>
#include <windows.h>
#include <conio.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秒
    }
    return 0;
}

用户每按下一个键,都会将对应的字符放到输入缓冲区中,kbhit() 函数会检测缓冲区中是否有数据,如果有的话就返回非 0 值,没有的话就返回 0 值。但是 kbhit() 不会读取数据,数据仍然留在缓冲区,所以一般情况下我们还要结合输入函数将缓冲区种的数据读出

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值