携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情
从scanf()角度看输入
假设scanf()根据一个%d转换说明读取一个整数:scanf()函数每次读取一个字符,跳过所有空白字符,直至遇到第一个非空白字符才开始读取。因为要读取整数,所以 scanf()希望发现一个数字字符或者一个符号。它就保证了该数字并读取下一个字符。scanf()不断读取和保存字符,直至遇到非数字字符。如果遇到非数字字符,它便认定读到整数的末尾。然后,scanf()把非数字字符放回输入。这意味着程序在下一次读取输入时,首先读到的是上一次读取丢弃的非数字字符。最后,scanf()计算已读取数字相应数值,并将计算后的值放入指定的变量中。
格式字符串中的普通字符
scanf()函数允许把普通字符放在格式字符串中。除格式字符串外的普通字符必须与输入字符串严格匹配。例如,假设在两个转换说明中添加一个逗号:
scanf("%d,%d",&n,&m);
scanf()函数将其解释成:用户将输入一个数字,一个逗号,然后再输入一个数字,也就是说,用户必须像下面这样进行输入两个整数:
88,121
由于格式字符串中,%d后面紧跟着逗号,所以必须输入88后再输入一个逗号。但因为scanf()会跳过整数前面的空白,所以下面两种输入方式都可以:
- 第一种:
88,121
- 第二种
88,
121
格式字符串中的空白意味着跳过下一个输入项前面的所有空白。例如这样输入都是可以的:
- 第一种
88,121
- 第二种
88 ,121
- 第三种
88 , 121
所有空白概念包括没有空格的特殊情况
例外
对于%c而言,在格式字符串中添加一个空格字符会有所不同。例如,如果在格式字符串中把空格放到%c的前面,scanf()便会跳过空格,从第一个非空白字符开始读取。也就是说:scanf("%c",%ch)从输入中的第一个字符开始读取,而scanf(" %c",%ch)则从第一个非空白字符开始读取。
scanf()的返回值
scanf()函数返回成功读取的项数。如果没有读取任何项,且需要读取一个数字而用户却输入一个非数值字符串,scanf()便返回0.