一、 printf 是输出语句,%md 表示输出的宽为m位。但另有附加规定:当所给宽度不足(即m<要输出数字的实际宽度)时,忽略m,原样输出要输出的值。
理解下面的代码加深对printf语句中宽度修饰符m的理解:
在这里插入图片描述
二、scanf 是输入语句,%md 表示读入的数为m位整数,超出m位只读m位,不足m位则按实际位数读入。
对于如下代码:(其中m=3)
#include<stdio.h>
int main()
{
int a;
scanf("%3d",&a);
printf("a=%d\n",a);
return 0;
}
当输入两位数12时,输出:
在这里插入图片描述
即2<m,原样输出。
当输出四位数1234时,输出:
在这里插入图片描述
即4>m,输出m的位数。
sacnf()函数的用法:
功能:等待用户从键盘上输入数据,然后按格式控制的要求对数据进行转换后送到相应的变量地址中去。
格式:scanf(“格式控制”,地址表列);
(特别注意对于字符串S的处理使用):
scanf()在读取数字时会跳过空格、制表符和换行符!当输入带有 空格 回车制表符(tap)时,如 a b c d 此时编译器不会识别空格 回车制表符(tap)而是默认自动在字符串后面添加’\0’作为结束标志因此此时终端会打印到a 时停止打印。
举个例子如下图:
输入垃圾的产生:
程序连续接收了三个字符,在C中enter键代表一个换行符,所以当输入完a的值‘q’之后按下enter键,换行符立马被字符b接收了,然后程序再向下走,输入c的值‘w’。结果就会按顺序显示a,b,c的值,我们已经知道a='q',b='\n',c='w';所以结果就会显示两行。
解决方法:使用getcher
当出现 : scanf("%s",a);
scanf("%s",a);此时输入字符串 abcdef,在输入结束时编译器(不会舍弃最后的回车符!下一次输入时从缓冲区读取出来)因此可能出现下一个scanf会读取上一个scanf的回车,导致输入冲突,此时需要在其中间加一个getchar();用来回收上一个scanf的回车,如果scanf 输入字符串后没有另外的输入函数则不需要getchar();
方法二:使用fgets()函数:
使用fgets()函数,可以接受 空格 回车 TAP ,但是在字符串结束时编译器会默认给予一个’\0’的结束字符,因此在使用时应该注意定义数组的变量个数,以免造成溢出或者占用内存问题;
#include <stdio.h>
int main(void)
{
char str[20];//定义一个最大长度为19,末尾是'\0'的字符数组来存储字符串
printf("请输入一个字符串:");
fgets(str,7,stdin);//从输入流stdin即输入缓冲区中读取7个字符到字符数组str中
printf("%s\n",str);
return 0;
}
其中:s 代表要保存到的内存空间的首地址,可以是字符数组名,也可以是指向字符数组的字符指针变量名。size 代表的是读取字符串的长度。stream 表示从何种流中读取,可以是标准输入流 stdin。标准输入流就是前面讲的输入缓冲区。所以如果是从键盘读取数据的话就是从输入缓冲区中读取数据,即从标准输入流 stdin 中读取数据,所以第三个参数为 stdin。
我们发现输入的是“i love you”,而输出只有“i love”。原因是 fgets() 只指定了读取 7 个字符放到字符数组 str 中。“i love”加上中间的空格和最后的 '\0' 正好是 7 个字符。
那有人会问:“用 fgets() 是不是每次都要去数有多少个字符呢?这样不是很麻烦吗?”不用数!fget() 函数中的 size 如果小于字符串的长度,那么字符串将会被截取;如果 size 大于字符串的长度则多余的部分系统会自动用 '\0' 填充。所以假如你定义的字符数组长度为 n,那么 fgets() 中的 size 就指定为 n–1,留一个给 '\0' 就行了。
但是需要注意的是,如果输入的字符串长度没有超过 n–1,那么系统会将最后输入的换行符 '\n' 保存进来,保存的位置是紧跟输入的字符,然后剩余的空间都用 '\0' 填充。所以此时输出该字符串时 printf 中就不需要加换行符 '\n' 了,因为字符串中已经有了。
三、.n用法 :对实数,指定小数点后位数(四舍五入)
对字符串,指定实际输出位数。
对实数.n 直接上图片显示:
在%f中加.2结果将小数部分精确到2位
如果是下面情况:
对字符串,指定实际输出位数
四、在C程序中显示八进制数前缀0和十六进制前缀0x
输出十进制,8进制,16进制时应注意:
#include<stdio.h>
int main()
{
int x = 100;
printf("%d,%o,%x\n",x,x,x);
}
100,144,64
在8进制o 与16进制x前面加入前缀:
#include<stdio.h>
int main()
{
int x = 100;
printf("%d,%#o,%#x",x,x,x);
}
输出:
100,0144,0x64
要分别在转换说明中加入#