1、函数
在 C 语言中,有多个函数可以从键盘获取用户输入:
● scanf():和 printf() 一样,scanf() 可以从键盘获取多种类型的数据,可一次读取多份输入数据;
该函数读取字符串以空格为结束符,也就是无法读取含有空格的字符串;
● getchar(),getche(),getch() :这三个函数都用于输入单个字符,一次只能读取一份输入数据;
● gets_s() :获取一行数据,并作为字符串处理;
2、关于代码安全性检查
如何解决因 SDL 检查带来的代码无法运行的问题:
● 采用 scanf_s () 的安全版本;
● VS 新建项目去掉 " 安全开发生命周期(SDL)检查 " 即可;
● 在头文件包含最前面加 #define _CRT_SECURE_NO_WARNINGS 宏定义;
● 在编译头文件最前面加 #pragma warning( disable : 4996);
3、代码
scanf () 函数是格式化从键盘获取输入,和 printf () 功能相反:
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{
int a = 0, b = 0, c = 0, d = 0;
//读取键盘输入并将值赋值给变量
//& 称为取地址符
scanf_s("%d", &a);
scanf_s("%d", &b);
printf("a+b=%d\n", a + b);
//输出变量 a 的内存地址
cout << &a << endl;
printf("%#x", &a);
//%p表示以十六进制形式输出数据的内存地址
printf("%p\n", &a);
//下一行代码获取的值可以输入一个回车再输入另一个
//也可以输入一个,按照格式要求空格,在同一行再输入另一个
scanf("%d %d", &c, &d);
printf("a*b=%d\n", c*d);
return 0;
}
4、读取步骤
● 我们键盘输入的数据并没有直接交给 scanf() ,而是放入了缓冲区,知道回车之后 scanf() 才到缓冲区读取;
5、scanf () 格式控制符
格式控制符 | 说明 |
%c | 读取一个单一的字符 |
%hd , %d , %ld | 读取一个十进制整数,并分别赋值给short、int、long |
%ho , %o , %lo | 读取一个八进制整数 (前缀随意) ,并分别赋值给short、int、long |
%hx , %x , %lx | 读取一个十六进制整数 (前缀随意),并分别赋值给short、int、long |
%hu , %u , %lu | 读取一个无符号整数,并分别赋值给 unsigned short、int、long |
%f , %lf | 读取一个十进制小数,并分别赋值给float、double |
%e , %le | 读取一个指数形式的小数,并分别赋值给float、double |
%g , %lg | 既可以读取一个十进制形式的小数,又可以读取一个指数形式的小数分别赋值给float、double |
%s | 读取一个字符串,以空格为结束符 |
6、getchar ()、getche ()、getch ()
● getchar () 就是 scanf ("%c" , c) 的替代:
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{
char a = getchar();
printf("%c", a);
return 0;
}
● getche () 函数没有缓冲区,输入一个字符后立刻读取,不需要用户按下回车键:
#include <iostream>
#include <string>
#include <stdio.h>
#include <conio.h>
using namespace std;
int main()
{
char a = getche();
printf("\nc:%c\n", a);
return 0;
}
● getch () 也没有缓冲区,特别之处是没有回显,看不到输入的字符:
#include <iostream>
#include <string>
#include <stdio.h>
#include <conio.h>
using namespace std;
int main()
{
char a = getch();
printf("\nc:%c\n", a);
return 0;
}
● getche () 和 getch () 函数都位于 conin.h 中,不是标准函数,默认只能在 Windows 下使用;
7、getchar ()、getche ()、getch () 总结
函数 | 缓冲区 | 头文件 | 回显 | 适用平台 |
getchar () | 有 | stdio.h | 有 | Windows、Linux、Max OS |
getche () | 无 | conio.h | 有 | Windows |
getch () | 无 | conio.h | 无 | Windows |
8、gets_s ()
● gets_s () 函数用来获取键盘输入的字符串:
#include <iostream>
#include <string>
#include <stdio.h>
#include <conio.h>
using namespace std;
int main()
{
char a[20];
gets_s(a);
printf("a=%s\n", a);
return 0;
}
● gets_s () 可以读取带有空格的字符串,scanf () 不能;
9、scanf () 的高级用法
9.1、指定读取长度
● %10s 表示读取字符串的最大长度为10;
#include <iostream>
#include <stdio.h>
#include <conio.h>
using namespace std;
int main()
{
char a[20];
int b;
scanf("%10s", &a);
//清空scanf缓冲区
rewind(stdin);
printf("%s\n", a);
scanf("%5d", &b);
rewind(stdin);
printf("%d\n", b);
}
9.2、匹配特定的字符
● %[a-z]:只读取小写字母;
● %[^a-z]:读取除小写字母之外的所有;
● %[0-9]:只读取数字0-9;
● %[A-Z]:只读取大写字母;
● %[a-zA-Z]:读取所有英文字母;
● %[a-zA-Z0-9]:读取所有;
#include <iostream>
#include <string.h>
int main()
{
char a[30];
//读取除换行符之外的所有字符
scanf("%[^\n]", a);
rewind(stdin);
printf("%s\n", a);
}
#include <iostream>
#include <stdio.h>
#include <conio.h>
using namespace std;
int main()
{
char a[20];
scanf("%[a-zA-Z]", &a);
rewind(stdin);
printf("%s\n", a);
}
#include <iostream>
#include <stdio.h>
#include <conio.h>
using namespace std;
int main()
{
char a[30];
//读取长度最大为20的除数字和换行符之外的字符串,可以读取空格
scanf("%20[^0-9\n]", &a);
rewind(stdin);
printf("%s\n", a);
}
9.3、丢弃读取到的字符
● %*d:表示读取一个整数并丢弃;
● %*[a-z]:表示将读取的小写字母丢弃;
● %*[^a-z]:表示将小写字母之外的所有丢弃;