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() 不会读取数据,数据仍然留在缓冲区,所以一般情况下我们还要结合输入函数将缓冲区种的数据读出
本文介绍了C语言中scanf函数的一些高级用法,包括指定长度输入、限定范围数据读取、丢弃已读取数据,并详细讲解了如何实现非阻塞输入,利用kbhit()函数检测输入缓冲区状态,实现更灵活的用户交互。
2050

被折叠的 条评论
为什么被折叠?



