C语言中函数数据类型修饰符的用法 //部分图片参考其他博主

一、 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

要分别在转换说明中加入#


 

发布了14 篇原创文章 · 获赞 0 · 访问量 423

猜你喜欢

转载自blog.csdn.net/LIGUOZHENLX/article/details/104041186
今日推荐