scanf()函数

scanf的使用

scanf()函数使用空白(换行符、制表符和空格)把输入分成多个字段。在依次把转换说明和字段匹配时跳过空白。示例如下:

#include int main(){int a=10;char ch[30];// 字符数组scanf("%d",&a);scanf("%s",ch);printf("a=%d \nch=%s",a,ch);}

scanf怎么读取输入

首先看一个例子

#include int main(){int a=10;char s1[30];// 字符数组char s2[30];scanf("%d",&a);scanf("%s",s1);scanf("%s",s2);printf("a=%d \ns1=%s \ns2=%s",a,s1,s2);}

以输入整形为例,如果在输入整数a时,输入了非整数其他字符会怎样呢?

  • scanf()根据一个%d转换说明读取一个整数。scanf()函数每次读取一个字符,跳过所有的空白字符,直至遇到第1个非空白字符才开始读取(跳过输入的空白,直到遇到第一个非空白字符‘+’)。
  • 因为要读取整数,scanf()希望发现一个数字字符或者一个符号(+或-)。如果找到一个数字或符号,它便保存该字符,并读取下一个字符。如果下一个字符是数字,它便保存该数字并读取下一个字符。scanf()不断地读取和保存字符,直至遇到非数字字符。(此时已经保存了”+10″,在读取下一个字符时发现是非数字字符a)
  • 如果遇到一个非数字字符,它便认为读到了整数的末尾。然后,scanf ()把非数字字符放回输入。这意味着程序在下一次读取输入时,首先读到的是上一次读取丢奔的非数字字符。(在第二个sacnf时跳过阻塞,直接读取到了缓冲区内的非数字字符)

读取字符串和字符

读取字符串

在介绍scanf怎么读取输入时,有没有注意到s1读取到的是第二块空格前的内容,而不是后面的整个字符串”acm ACM”。

原因在于scanf()函数使用空白(换行符、制表符和空格)把输入分成多个字段
使用%s转换说明,scanf()会读取除空白以外的所有字符。scanf()跳过空白开始读取第1个非空白字符,并保存非空白字符直到再次遇到空白。
scanf()根据% s 转换说明读取一个单词,即不包含空白字符的字符串。scanf()无法一次读取多个单词。
(注意:当scanf ()把字符串放进指定数组中时,它会在字符序列的末尾加上’\0’,让数组中的内容成为一个C字符串。)

读取字符

观察例子的两者有什么不同?

scanf("%d%d", &n,&m)
scanf("%d %d", &n,&m)
  1. 表面上,在第二个scanf中转换说明之间存在空白
  2. 本质上,没有任何区别。

格式字符串中的空白意味着跳过下一个输入项前面的所有空白。
因此,scanf(“%d%d”, &n,&m)与scanf(“%d %d”, &n,&m)的行为相同。

那么问题来了,如果现在要使用scanf读取一个整数和一个字符,代码怎么写?

#include int main(){char ch;int a;scanf("%d",&a);scanf("%c",&ch);printf("a=%d,ch=%c",a,ch);}


字符’a’表示还没上车!ch读取了空白字符,但是这并不是我们要求的问题,我们是要读取一个输入的非空白字符,scanf直接将’10’与’a’之间的空白字符“交给了”ch

怎么解决?所以对于%c,如果把%c放在格式字符串中的空格前面,scanf()便会跳过空格,从第1个非空白字符开始读取。

#include int main(){char ch;int a;scanf("%d",&a);scanf(" %c",&ch);printf("a=%d,ch=%c",a,ch);}


总结一下:

  • scanf(“%c” ,&ch)从输入中的第1个字符开始读取
  • scanf(” %c”,&ch)则从第1个非空白字符