2.占位符
scanf()常用的占位符如下(基本与printf函数一致):
1 %c:字符。
2 %d:整数。
3 %f:float类型浮点数。
4 %lf:double类型浮点数。
5 %Lf:long double类型浮点数。
5 %s:字符串。
6 %[]:在方括号中指定一组匹配的字符(比如%[0-9],遇到不在集合之中的字符,匹配将会停止。
上面所有占位符中,除了%c以外,都会自动忽略起首的空白字符。%c不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空。
如果要强制跳过字符前的空白字符,可以写成scanf("%c",&ch),即%c前加上一个空格,表示跳过零个或多个空白字符。
下面要特别说一下占位符%s,它其实不能简单地等同于字符串。它的规则是,从当前第一个非空白字符读起,直到遇到空白字符(即空格,换行符,制表符等)为止。
因为%s不会包含空白字符,所以无法用来读取多个单词,除非多个%s一起使用,这也意味着,scanf()不适合读取包含空格的字符串,比如书名或歌名。另外,scanf()遇到%s占位符,会在字符串变量末尾储存一个\0.
scanf()将字符串读入字符数组时,不会检测字符串是否超过数组长度。所以,储存字符串时,很可能超过数组的边界,导致预想不到的结果。为了防止这种情况,使用%s占位符时,应该指定读入字符串的最长长度,即写成%[m]s,其中[m]是一个整数,表示读取字符串的最大长度,后面的字符将被丢弃。
1 #include <stdio.h>
2 int mian()
3 {
4 char name[11];
5 scanf(”%10s",&name);
6 printf("%s\n",name)
7 return 0;
8 }
上面示例中,name是一个长度为11的字符数组,scanf()的占位符%10s表示最多读取用户输入的10个字符,后面输入的字符将被丢弃,这样就不会数组溢出的风险了。