目录
编辑3.空白字符只需有一个即可使输入时的所有空白字符忽略并删除。
4.非空白字符则需要按照格式;如果是非空白字符和空白字符混搭,空白字符在非空白字符哪边,那里的所有空白字符都会被忽略并删除(非空白字符需要按格式输入)。
5.读取不同格式数据会导致scanf函数在此处停止并将该数之后(包含该数)的数据留在缓冲区)。
一、导言
在正式介绍scanf函数前我们需要了解一个小知识点(已经了解的朋友可以转到一、scanf函数介绍):1与‘1’的区别;
首先 1是我们熟知的数字1(数值1)可以表示数量和值的大小例如:1个鸡蛋,1瓶水,50千克等等。
其次 ‘1’则表示的是字符1(符号1)它本质是一个符号当我们读得的时候会告诉我们数值1这个信息。
区别:在ascall码值中‘1’对应为十进制的49,而数值1本身就是一个十进制的值。
二、函数介绍
头文件(stdio.h)
函数原型int scanf(“格式控制字符串“,地址列表)
简单点说就是读取指定格式数据存到对应地址中。
注意点:
1. int为函数返回值类型意义为成功读入的数据个数;遇到EOF(文件结束标志值为-1)或者读取错误则返回-1。(利用这一点可以进行多组数据读取可前往 三、常规使用场景)
2.Scanf函数在读到第一个正确数据前会忽略这个数据之前的数据。
三、函数的使用
使用方法一:读取单个数据到指定的地址。需注意输入的数据类型是否与控制符对应。
使用方法二:无分割符号且读取多组数据到所对应的多个地址,输入数据时需要顺序类型对应。即使在输入数据时中间输入无数个种类和个数的空白符也会被忽略并删除。
方法三:有字符作为分割符号在输入时需要与格式保持一致。
三个方法所需注意点:
1.输入数据时%c可以读取空白字符。
如下图:输入一个回车。此时空白符(‘ ’,‘\n’,’\t’,’\r’,’\v’等等)也可以被读取(空白字符也是字符所以能被读取)
2.%s必须要用空白字符作为结束一个字符串的读取。
int main()
{
char a[5] = { 0 };
scanf("%s", &a);
return 0;
}
下图中在字符串后输入一个空格后按回车输入。
3.空白字符只需有一个即可使输入时的所有空白字符忽略并删除。
int main()
{
char a = 0 ;
char b = 0;
scanf("%c %c", &a,&b);
return 0;
}
4.非空白字符则需要按照格式;如果是非空白字符和空白字符混搭,空白字符在非空白字符哪边,那里的所有空白字符都会被忽略并删除(非空白字符需要按格式输入)。
5.读取不同格式数据会导致scanf函数在此处停止并将该数之后(包含该数)的数据留在缓冲区)。
例子:
int main()
{
int a = 0;
int c = 0;
char b = 0;
char f = 0;
scanf("%c%d%d", &b, &a, &c);
printf("%d",f=getchar());
return 0;
}
分析:上述代码中函数只读取了和控制字符相同的数据’a’,在读取第二个%d(十进制整型)控制符时因为输入的是字符型在这里中断,被下面getchar函数(从缓冲区读取一个字符返回其ascall码值)读取存放到f变量中。
在使用中上方的代码时如果输入的数据是:1 2 3会有朋友疑惑为什么也可以被读取,我想说的是朋友你是否忘记你输入的1是否也可以被当成字符1被%c读取呢?当然是可以的。
题目:%d%d组合输入的却是1 空白符 2会出现空白符被删除且被忽略直接读取到1和2.
%d%c组合输入1 空白符 2 %c会读取到空白符。
%s%d组合输入shuzu 空白符 2中空白符作用为停止数组的输入且空白符会忽略并删除。
四、常规使用场景
前文说过scanf会返回成功读入的数据个数;遇到EOF(文件结束标志值为-1)或者读取错误则返回-1。
当读取多组数据时该怎么办呢?如1 \n 2 \n 3 \n……肯定不会选用一个一个设定格式输入,我们会采用如下方式:
第三种方法意思为当scanf返回-1时~(按位将数据的二进制取反)-1转为0 ;while循环中为假则跳出循环。
注意:细心的朋友会发现这样写需要一直输入无法自动停下,这个不需要担心在刷题中会自动帮你停止我们不需要考虑这个问题。自己测试时可输入ctrl+z(为EOF,值为-1)进行手动停止需要输入三次。
五、总结
Scanf函数的使用看似细节复杂,但使用起来非常简单。就目前而言只需要掌握以下几点:
1.输入数据时%c可以读取空白字符。
2.%s必须要用空白字符作为结束一个字符串的读取。
3.空白字符只需有一个即可使输入时的所有空白字符忽略并删除。
4.非空白字符则需要按照格式;如果是非空白字符和空白字符混搭,空白字符在非空白字符哪边,那里的所有空白字符都会被忽略并删除(非空白字符需要按格式输入)。
5.读取不同格式数据会导致scanf函数在此处停止并将该数之后(包含该数)的数据留在缓冲区)。