总显示正负号:
printf函数默认情况下不对正数显示+号,只对负数显示-号,如果想正数也输出+号,可以在占位符的%后面加一个+。
显示宽度
#include <stdio.h>
int main()
{
printf("%5d\n",1234);
return 0;
}
1234
可以看到输出结果是 1234,%5d的意思就是打印的最低是5位宽度位数不够就用空格补充,对齐方式默认是右对齐。
如果数大于预定的宽度呢?
#include <stdio.h>
int main()
{
printf("%5d\n",123456);
return 0;
}
123456
可以看到程序打印的结果并不是5位的宽度,因为超过5的宽度就会正常输出。
浮点数
#include <stdio.h>
int main()
{
float a = 0.0;
printf("%9.2f",487.154);
return 0;
}
这个程序打印的结果是什么呢?
487.15
为什么打印的会是这个结果呢?
前面说过所以这里的12表示浮点数的最低宽度, 后面的***.2***(注意这里有个小数点),表示的是小数点后面的浮点数是多少位,后面的浮点数直接舍掉,前面说过宽度不够用空格代替所以这里的结果是 487.15。
**
printf()参数与占位符是一一对应关系,如果有n个占位符,printf()的参数就应该有n+1个,printf函数第一个参数是字符串“ ”这个算空字符串,所以是n+1个。
下面是占位符:
**
scanf函数
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a); //数组可以不用加&号
printf("%d\n",123456);
return 0;
}
scanf()处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符,scanf输出字符占位符的时候,不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格。
#include <stdio.h>
int main()
{
int x;
float y;
//用户输入"-13.45e12#0"
scanf("%d",&x);
scanf("%f",&y);
return 0;
}
上面示例中,scanf()读取用户输入时,%d占位符会忽略起首的空格,从-处开始获取数据,读
取到-13停下来,因为后面的 .(这里有小数点)不属于整数的有效字符。这就是说,占位符%会读到-13.
第二次调用scanf()时,就会从上一次停止解读的地方,继续往下读取。这一次读取的首字符
是,由于对应的占位符是%f,会读取到45e12,这是采用科学计数法的浮点数格式。后面的
#不属于浮点数的有效字符,所以会停在这里。
%c不会忽略空白字符。其他的自动忽略起首的空白字符。%不忽略空白字符,总是返
回当前第一个字符,无论该字符是否为空格。
如果要强制跳过字符前的空白字符,可以写成 scanf(" %c",&x),即%前加上一个空格,表
示跳过零个或多个空白字符。
下面要特别说一下占位符%s,它其实不能简单地等同于字符串。它的规则是,从当前第一个非空白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止。
因为%s不会包含空百字符,所以无法用来读取多个单词,除非多个%s一起使用。这也意味着,"
scanf()不适合读取可能包含空格的字符串,比如书名或歌曲名。另外,scanf()遇到%s占位
符,会在字符串变量末尾存储一个空字符1日。
scanf()将字符串读入字符数组时,不会检测字符串是否超过了数组长度。所以,储存字符串时,
很可能会超过数组的边界,导致预想不到的结果。为了防止这种情况,使用%s占位符时,应该指定读入字符串的最长长度,即写成%[m]s,其中的「m]是一个整数,表示读取字符串的最大长度,后面的字符将被丢弃。
最后可以用%c表示忽略字符。