• C语言格式化输出


    一、格式化输出

    格式化输出的函数有printf、sprintf和snprintf等,功能略有不同,使用方法大同小异,本章节我们先以printf为例。

    对于 printf 函数,相信大家并不陌生。之所以称它为格式化输出函数,该函数的声名如下:

    int printf(const char *format, ...)
    

    大家看到printf函数的声明就会有点懵,它参数的写法与我们之前学到的函数知识不一样,printf函数是一个“可变参数函数”(即函数参数的个数是可变的),可变参数函数的知识以后再介绍,现在只要知道怎么使用就行了。

    printf函数的参数的个数和类型都是可变的,每一个参数的输出格式都有对应的格式说明符与之对应,从格式串的左端第1 个格式说明符对应第 1 个输出参数,第 2 个格式说明符对应第 2 个输出参数,第 3个格式说明符对应第 3 个输出参数,以此类推。

    其中,格式说明符的形式如下(方括号 [] 中的项为可选项):

    %[flags][width][.prec] type
    

    1、类型符(type)

    它用以表示输出数据的类型,以下是常用类型的汇总,不常用的就不列了。

    %hd、%d、%ld 以十进制、有符号的形式输出 short、int、long 类型的整数。

    %hu、%u、%lu 以十进制、无符号的形式输出 short、int、long 类型的整数

    %c 输出字符。

    %lf 以普通方式输出double(float弃用,long doube无用)。

    %e 以科学计数法输出double。

    %s 输出字符串。

    以上输出数据的知识在之前介绍数据类型的时候已演示过,这里就不举例了。

    2、宽度(width)

    它用于控制输出内容的宽度。

    printf("=%12s=
    ","abc");     // 输出=         abc=
    printf("=%12d=
    ",123);       // 输出=         123=
    printf("=%12lf=
    ",123.5);    // 输出=  123.500000=
    

    3、对齐标志(flags)

    flags它用于控制输出内容的对齐方式。

    不填或+:输出的内容右对齐,这是缺省的方式,上一小节就是右对齐的示例。

    -:输出的内容左对齐。

    printf("=%-12s=
    ","abc");    // 输出=abc         =
    printf("=%-12d=
    ",123);     // 输出=123         =
    printf("=%-12f=
    ",123.5);    // 输出=123.500000  =
    

    如果输出的内容是整数或浮点数,并且对齐的方式是右对齐,可以加0填充,例如:

    printf("=%012s=
    ","abc");  // 输出=         abc=
    printf("=%012d=
    ",123);   // 输出=000000000123=
    printf("=%012f=
    ",123.5);  // 输出=00123.500000= 
    

    从上面第一行代码的结果看出,输出的内容不是整数或浮点数,是字符串,不能在前面填0。

    左对齐的时候,能在整数或浮点数的后面补0吗?浮点数最多可以补到6位,整数不行,为什么?您的存款能在后面补0吗?

    4、精度(prec)

    如果输出的内容是浮点数,它用于控制输出内容的精度,也就是说小数点后面保留多少位,后面的数四舍五入。

    printf("=%12.2lf=
    ",123.5);   // 输出=      123.50=
    printf("=%.2lf=
    ",123.5);     // 输出=123.50=
    printf("=%12.2e=
    ",123500000000.0);  // 输出=    1.24e+11=
    printf("=%.2e=
    ",123500000000.0);    // 输出=1.24e+11=
    

    二、格式化输出到字符串

    int printf(const char *format, ...);
    int sprintf(char *str, const char *format, ...);
    int snprintf(char *str, size_t size, const char *format, ...);
    

    功能:printf是把结果输出到屏幕,sprintf把格式化输出的内容保存到字符串str中,snprintf的n类似于strncpy中的n,意思是只获取输出结果的前n-1个字符,不是n个字符。

    在之前的章节中,介绍过把字符串转换为整数和浮点数据的库函数,C语言没有提供把整数和浮点数据转换为字符串的库函数,而是采用sprintf和snprintf函数格式化输出到字符串。

    示例(book98.c)

    /*
     * 程序名:book98.c,此程序演示格式化输出sprintf和snprintf函数。
     * 作者:C语言技术网(www.freecplus.net) 日期:20190525
    */
    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
       char str[301];
    
      // 格式化输出到str中
      sprintf(str,"%d,%c,%f,%s",10,'A',25.97,"一共输入了三个数。");
      printf("%s
    ",str);
    
      // 格式化输出到str中,只截取前7个字符
      snprintf(str,8,"%d,%c,%f,%s",10,'A',25.97,"一共输入了三个数。");
      printf("%s
    ",str);
    }
    

    运行结果

    在这里插入图片描述

    程序运行第二行只输出了6个字符,注意,snprintf函数在unix和windows平台下的表现略有不同,在windows平台下,第二行会输出7个字符。

    三、C语言代码的多行书写

    在我们之前学习的过程中,编写的程序的功能很简单,一句代码很短,但是在实际开发中,参数往往很长很多,一句代码可能会很长,需要用多行才能书写。

    如果我们在一行代码的行尾放置一个反斜杠,c语言编译器会忽略行尾的换行符,而把下一行的内容也算作是本行的内容。这里反斜杠起到了续行的作用。

    strcpy(str,"aaaaaaaaaa
    bbbbbbbbb);
    

    如果我们不使用反斜杠,当我们试图初始化一个跨多行的字符串时,c语言编译器可能会发出警告或错误,如下面的语句是不正确的。

    strcpy(str,"aaaaaaaaaa
    bbbbbbbbb);
    

    C语言中还有字符串多行书写的方法,那就是将它写个多个字符串,C语言编译器会自动将这些字符串连接起来,如下:

     strcpy(str,"aaabbbccc");
      printf("str=%s=
    ",str);   // 输出str=aaabbbccc=
     
      strcpy(str,"aaa""bbb""ccc");
      printf("str=%s=
    ",str);   // 输出str=aaabbbccc=
    
      strcpy(str,"aaa"
                 "bbb"
                 "ccc");
      printf("str=%s=
    ",str);   // 输出str=aaabbbccc=
    
    
      sprintf(str,"aaabbbccc");
      printf("str=%s=
    ",str);   // 输出str=aaabbbccc=
    
      sprintf(str,"aaa""bbb""ccc");
      printf("str=%s=
    ",str);   // 输出str=aaabbbccc=
    
      sprintf(str,"aaa"
                  "bbb"
                  "ccc");
      printf("str=%s=
    ",str);   // 输出str=aaabbbccc=
    

    以上每段代码的输出结果完全一样,表达式:"aaa" "bbb" "ccc" 实际上相当于"aaabbbccc"。

    把字符串很长,参数很多的代码用多行书写,可以使程序代码结构更清晰,以下代码是我实际开发中用到的一句代码,这还不算长的。

    在这里插入图片描述

    四、课后作业

    1)编写示例程序,把本章节介绍的知识点全部演示一遍,用程序演示可以加深您的理解和映象。

    2)编写一个解析XML字符串的函数。

    函数声明:

    int  GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,char *out_Value);
    

    in_XMLBuffer,XML格式的字符串,如下:

    <name>西施</name><age>18</age><sc>火辣</sc><yz>漂亮</yz>
    

    in_FieldName,字段的标签名。

    out_Value,获取内容存放的变量的指针。

    返回值,0-成功,-1-失败。

    调用示例:

    char strXMLBuffer[1024];
    strcpy(strXMLBuffer," <name>西施</name><age>18</age><sc>火辣</sc><yz>漂亮</yz>");
    char strvalue[51];
    GetXMLBuffer(strXMLBuffer,"name",strvalue);   // strvalue的内容将是"西施"
    GetXMLBuffer(strXMLBuffer,"age",strvalue);     // strvalue的内容将是"18"
    GetXMLBuffer(strXMLBuffer,"sc",strvalue);       // strvalue的内容将是"火辣"
    GetXMLBuffer(strXMLBuffer,"yz",strvalue);       // strvalue的内容将是"漂亮"
    

    五、版权声明

    C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。
    来源:C语言技术网(www.freecplus.net)
    作者:码农有道

    如果文章有错别字,或者内容有错误,或其他的建议和意见,请您留言指正,非常感谢!!!

  • 相关阅读:
    针对wamp的phpmyadmin显示#2003无法连接mysql
    vs2019编译gdal3.1.0报错 (filemanager.obj) : error LNK2001: 无法解析的外部符号 __imp_SHGetFolderPathW
    半透明遮罩层覆盖整个可视区域
    css首字下沉
    仿花瓣标题栏始终在页面顶部(ie6下position:fixed失效解决方法)
    Redis最佳实践及核心原理
    Java对接微信公众号模板消息推送
    XXLJOB任务调度
    MyBatis学习笔记
    SpringBoot集成Redis
  • 原文地址:https://www.cnblogs.com/wucongzhou/p/12498790.html
Copyright © 2020-2023  润新知