zoukankan      html  css  js  c++  java
  • printf(),sprintf_s()格式化输出

    一、 printf的格式控制的完整格式:
    % - 0 m.n l或h 格式字符
    下面对组成格式说明的各项加以说明:
    ①%:表示格式说明的起始符号,不可缺少。
    ②-:有-表示左对齐输出,如省略表示右对齐输出。
    ③0:有0表示指定空位填0,如省略表示指定空位不填。
    ④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。N指精度。用于说明输出的实型数的小数位数。对数值型的来说,未指定n时,隐含的精度为n=6位。
    ⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。

    ---------------------------------------
    格式字符
    格式字符用以指定输出项的数据类型和输出格式。
    ①d格式:用来输出十进制整数。有以下几种用法:
    %d:按整型数据的实际长度输出。
    %md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。
    %ld:输出长整型数据。
    ②o格式:以无符号八进制形式输出整数。对长整型可以用"%lo"格式输出。同样也可以指定字段宽度用“%mo”格式输出。 例: 

    main() 
    { int a = -1; 
      printf("%d, %o", a, a); 
    } 
    运行结果:-1,177777 
    程序解析:-1在内存单元中(以补码形式存放)为(1111111111111111)2,转换为八进制数为(177777)8

    ③x格式:以无符号十六进制形式输出整数。对长整型可以用"%lx"格式输出。同样也可以指定字段宽度用"%mx"格式输出。
    ④u格式:以无符号十进制形式输出整数。对长整型可以用"%lu"格式输出。同样也可以指定字段宽度用“%mu”格式输出。 ⑤c格式:输出一个字符。
    ⑥s格式:用来输出一个串。有几中用法
    %s:例如:printf("%s", "CHINA")输出"CHINA"字符串(不包括双引号)。
    %ms:输出的字符串占m列,如字符串本身长度大于m,则突破获m的限制,将字符串全部输出。若串长小于m,则左补空格。
    %-ms:如果串长小于m,则在m列范围内,字符串向左靠,右补空格。
    %m.ns:输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格,注意:如果n未指定,默认为0。
    %-m.ns:其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果n>m,则自动取n值,即保证n个字符正常输出,注意:如果n未指定,默认为0。
    如果是sprintf(desc, "%m.ns", sour);   如果desc空间够的话,会在%m.ns 串 的结尾自动补null字符,不同于strncpy。
    例如 :sprintf(desc, "%.3s", "123456");   desc如果空间>=4字节的话,第4个字节将是null字符。
    ⑦f格式:用来输出实数(包括单、双精度),以小数形式输出。有以下几种用法:
    %f:不指定宽度,整数部分全部输出并输出6位小数。
    %m.nf:输出共占m列,其中有n位小数,如数值宽度小于m左端补空格。
    %-m.nf:输出共占n列,其中有n位小数,如数值宽度小于m右端补空格。

    ⑧e格式:以指数形式输出实数。可用以下形式:
    %e:数字部分(又称尾数)输出6位小数,指数部分占5位或4位。
    %m.ne和%-m.ne:m、n和”-”字符含义与前相同。此处n指数据的数字部分的小数位数,m表示整个输出数据所占的宽度。

    ⑨g格式:自动选f格式或e格式中较短的一种输出,且不输出无意义的零。
    ---------------------------------------
    关于printf函数的进一步说明:
    如果想输出字符"%",则应该在“格式控制”字符串中用连续两个%表示,如:
    printf("%f%%", 1.0/3);
    输出0.333333%。
    ---------------------------------------
    对于单精度数,使用%f格式符输出时,仅前7位是有效数字,小数6位.
    对于双精度数,使用%lf格式符输出时,前16位是有效数字,小数6位.
    --------------------------------------------------------------------------------------
    printf()函数是格式输出函数,请求printf()打印变量的指令取决与变量的类型.例如,在打印整数是使用%d符号,在打印字符是 用%c 符号.这些符号被称为转换说明.因为它们指定了如何不数据转换成可显示的形式.下列列出的是ANSI C标准peintf()提供的各种转换说明.

    转换说明及作为结果的打印输出%a                浮点数、十六进制数字和p-记数法(C99)
    %A    浮点数、十六进制数字和p-记法(C99)
    %c    一个字符 
    %d    有符号十进制整数 
    %e    浮点数、e-记数法
    %E    浮点数、E-记数法
    %f    浮点数、十进制记数法  
    %g    根据数值不同自动选择%f或%e.
    %G    根据数值不同自动选择%f或%e.
    %i               有符号十进制数(与%d相同)
    %o    无符号八进制整数
    %p    指针    
    %s    字符串
    %u    无符号十进制整数
    %x    使用十六进制数字0f的无符号十六进制整数 
    %X    使用十六进制数字0f的无符号十六进制整数
    %%    打印一个百分号
    二、 sprintf_s,sprintf

    MSDN页面分别如下:

    spirntf_s:

    http://msdn.microsoft.com/zh-cn/library/ce3zzk1k%28VS.80%29.aspx

    _snprintf:

    http://msdn.microsoft.com/zh-cn/library/2ts7cx93%28v=VS.90%29.aspx

    _snprintf_s:

    http://msdn.microsoft.com/zh-cn/library/f30dzcf6.aspx

    spirntf_s 功能:将数据格式化输出到字符串

    头文件:stdio.h
    函数原型:

    int sprintf_s(
       char *buffer,
       size_t sizeOfBuffer,
       const char *format [,
          argument] ... 
    );
    int sprintf( char *buffer, const char *format [, argument] ... );
    返回值:

      The number of characters written, or –1 if an error occurred. If buffer or format is a null pointer, sprintf_sand swprintf_s return -1 and set errno to EINVAL.

    sprintf_s returns the number of bytes stored in buffer, not counting the terminating null character.swprintf_s returns the number of wide characters stored in buffer, not counting the terminating null wide character.

    #include <stdio.h>
    
    int main( void )
    {
       char  buffer[200], s[] = "computer", c = 'l';
       int   i = 35, j;
       float fp = 1.7320534f;
    
       // Format and print various data: 
       j  = sprintf_s( buffer, 200,     "   String:    %s\n", s );
       j += sprintf_s( buffer + j, 200 - j, "   Character: %c\n", c );
       j += sprintf_s( buffer + j, 200 - j, "   Integer:   %d\n", i );
       j += sprintf_s( buffer + j, 200 - j, "   Real:      %f\n", fp );
    
       printf_s( "Output:\n%s\ncharacter count = %d\n", buffer, j );
    }
    Output:
       String:    computer
       Character: l
       Integer:   35
       Real:      1.732053
    
    character count = 79

     常见用法

    //把整数123 打印成一个字符串保存在s 中。
    sprintf(s, "%d", 123); //产生"123"
    可以指定宽度,不足的左边补空格:
    sprintf(s, "%8d%8d", 123, 4567); //产生:" 123 4567"
    左对齐:
    sprintf(s, "%-8d%8d", 123, 4567); //产生:"123 4567"
    16 进制打印:
    sprintf(s, "%8x", 4567); //小写16 进制,宽度占8 个位置,右对齐
    sprintf(s, "%-8X", 4568); //大写16 进制,宽度占8 个位置,左对齐

    1、C程序

    char s[3],ch='a';
    sprintf(s,"%c",ch);  //s[]="a\0"

    2、C++

    string s,s1="auss is ";
    char ch='a';
    s=ch; //s[]="a\0"
    s1+=ch;  //s1[]="auss is a"

    3. 16进制输出字符串,sprintf_s 不能在linux上运行,可用snprintf替代

    string ToHexString(const string & szInput)  
    {  
        char temp[4];  
        string szHexOutput;  
      
        for (UINT i = 0 ; i < szInput.length() ; i++)  
        {  
            sprintf_s(temp,4,"%02X ",(byte)szInput[i]); //占两个字宽,右对齐 
            szHexOutput += string(temp,3);  
        }  
        return szHexOutput;  
    }  

    4.浮点数的打印和格式控制

      sprintf(s, "%m.nf", 3.1415926);    // m:代表打印的总长度,n代表小数位     默认n为6

    5.连接字符串

      sprintf(s, "%m.ns%m.ns",cArray1,cArray2)   //m:代表打印的总长度  n:代表取的字节长度

  • 相关阅读:
    我的浏览器收藏夹分类
    我的浏览器收藏夹分类
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 315 计算右侧小于当前元素的个数
    Java实现 LeetCode 315 计算右侧小于当前元素的个数
  • 原文地址:https://www.cnblogs.com/lovemo1314/p/2225761.html
Copyright © 2011-2022 走看看