scanf函数
2019-01-28 本文已影响0人
silasjs
必须用&告诉scanf函数变量的详细地址,才能存储用户输入的数据
int num;
scanf("%i", &num);
printf("num = %i\n", num);
- 利用scanf接收多个数据的时候,输入的内容要求和格式化字符串中的一模一样
- 如果输入的数据与格式化字符串中的不匹配,那么scanf函数会自动终止
int n1, n2;
scanf("%i,%i", &n1, &n2);
printf("n1 = %i, n2 = %i\n", n1, n2);
控制台:
1,2
n1 = 1, n2 = 2
(内容和格式化字符串中一样)
1 2
n1 = 1, n2 = 0
(内容不匹配格式化字符串)
-
如果多个数据之间没有其他分隔符,在控制台输入的时候可以用空格、回车、Tab来作为分隔符
-
如果在输入时,输入了多个空格、回车、Tab的话都会被系统忽略,没有影响的。
int n1, n2;
scanf("%i%i", &n1, &n2);
printf("n1 = %i, n2 = %i\n", n1, n2);
控制台:
1 2
n1 = 1, n2 = 2
(空格作为分隔符)
1
2
n1 = 1, n2 = 2
(换行作为分隔符)
1 2
n1 = 1, n2 = 2
(Tab作为分隔符)
- 但是,如果格式化字符串中有%c除外。因为空格、回车、Tab都会被当做字符处理
int n1, n2;
char cv;
scanf("%i%c%i", &n1, &cv, &n2);
printf("n1 = %i, cv = %c, n2 = %i\n", n1, cv, n2);
控制台:(空格作为分隔符)
1 a 2
n1 = 1, cv = , n2 = 0
-
so,只要连续接收多个数据,格式化字符串中间最好用固定的分隔符(例如:,或者 - )
-
scanf函数中格式化字符串末尾不能是\n,因为\n是scanf的结束符。如果末尾是\n的话,只能原样输入“\n”或者输入一个不匹配的字符。
int n1, n2;
scanf("%i%i\n", &n1, &n2);
printf("n1 = %i, n2 = %i\n", n1, n2);
控制台:
123
123
\n
n1 = 123, n2 = 123
- scanf的实现原理
- scanf是阻塞线程的,当它接收数据时,数据是从输入设备接收后保存在输入缓冲区的。
- 当最后接收到\n结束符时,scanf逐个从输入缓冲区获取可以匹配的数据,如果不匹配就会自动结束,并且不会修改对应变量的值,也不会取走输入缓冲区的数据。
- 如果在输入前,输入缓冲区已有数据,在结束时仍然会从头开始获取数据。
int n1, n2;
char c1;
scanf("%i%c%i", &n1, &c1, &n2);
printf("n1 = %i, c1 = %c, n2 = %i\n", n1, c1, n2);
char c2;
int n3;
scanf("%c%i", &c2, &n3);
printf("c2 = %c, n3 = %i\n", c2, n3);
控制台:(回车结束符在第一行尾)
12 + 34
n1 = 12, c1 = , n2 = 0
c2 = +, n3 = 34
- 如果需要单独取一个字符,而这个字符又被之前输入的字符堵着位置了,或者说输入缓冲区已经有一个其他的字符存在。那么,为了能避免取错,可以使用getchar();函数从输入缓冲区中获取字符。