往期回顾:
---scanf()函数用于读取用户的键盘输入。程序运行到这里时会停下来。等待用户从键盘输入;用户输入数据,按下回车键后,它就会处理用户输入,将其存入变量。
---scanf()和printf()的语法相似。
注意:变量前面必须加上&运算符(指针变量除外),因为scanf()传递的不是值而是地址。如果这里的变量是指针变量(比如字符串变量),那就不用加&运算符,数组前一般也不用。
---scanf()的返回值是一个整数,表示成功读取变量的个数,如果没有读取任何项或者匹配失败,则返回0;如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量EOF(-1)--end of file 文件结束标志。
---在vs环境中,连按三次 CTRL+Z,可以提前结束输入
---scanf()和printf()的占位符基本一致,下图中是几个常用的;

---上面所有占位符中,除了%c以外,都会自动忽略起首的空白字符,%c不忽略空白字符,总是返回当前第一个字符,无论该字符是不是空格字符(如图1),如果要强制跳过字符前的空白字符,可以在c前加一个空格(即% c),表示跳过0个或多个空白字符(如图2)。
图1~

图2~

--还需要特别说明一下占位符%s,它其实不能简单的等于字符串,它的规则是,从当前第一个非空白字符开始读起,直到遇到空白字符(即空格,换行符,制表符等)为止。
因为%s不会包含空白字符,所以无法用来读取多个单词,除非几个%s一起用或者用%[^\n]s,这也意味着,scanf()不适合读取可能包含空格的字符串,比如书名或者歌曲名。还有一点,scanf()遇到%s占位符,会在字符串变量末尾存储一个空字符\0。
注意:scanf()将字符串读入字符数组时,不会检测字符是否超过了数组长度。所以,储存字符串时,很可能会超过数组的边界,导致预想不到的结果。为了防止这种情况,使用%s占位符时,应该指定读入字符串的最长长度,即写成%[m]s,超出指定最长长度的字符将被丢弃,这样就不会有数组溢出的风险了。另外,需要注意一下\0也算一个字符。
如图所示:

--有时,我们的输入可能不符合预定的格式。如下图所示,如果用户输入2025-04-07,会正确的解读出来,但如果用户输入其他格式,就会解读失败。


为了避免这种情况,scanf提供了一个赋值忽略符 *,比如%*c。只要吧*号加到任何百分号后面,该占位符就不会返回值,解析后被丢弃。我们直接通过一个例子来感受一下吧,就拿上面的这个例子来试试~

结语;感谢大家的支持,欢迎在评论区底下留言讨论。