zoukankan      html  css  js  c++  java
  • Sprintf()的思考和引出的相关问题

    Sprintf()为什么不安全?

    功能

    把格式化的数据写入某个 字符串 缓冲区

    头文件

    原型

    int sprintf( char *buffer, const char *format, [ argument] … );

    参数列表

    bufferchar型指针,指向将要写入的字符串的缓冲区。
    format:格式化字符串。
    [argument].. .:可选参数,可以是任何类型的数据。
    返回值:字符串长度( strlen
    /*例子*/
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>//某个头文件
    int main () /*主函数“整数”类型*/
    {
           char buffer [50]; /*“字符”类型的数组,下面共有50个元素。*/
           int n, a=5, b=3; /*三个变量都为“整数”类型*/
           n= sprintf (buffer, "%d plus %d is %d" , a, b, a+b); /*赋予数值*/
           printf ( "[%s] is a string %d chars long " ,buffer,n); /*“格式输出”*/
     
           return 0; /*“返回 零”
           也就是程序正常退出*/
    }

    为什么不安全?

    因为sprintf函数无法检查内存溢出问题

    当以下的方式调用的时候会报错,内存溢出

    char buffer [5];/*“字符”类型的数组,下面共有50个元素。*/
       int n, a=5, b=3;/*三个变量都为“整数”类型*/
       n=sprintf (buffer, "%d plus %d is %d", a, b, a+b);/*赋予数值*/
       //printf ("[%s] is a string %d chars long ",buffer,n);/*“格式输出”*/

    如何解决?

    sprintf_s()是sprintf()的安全版本,通过指定缓冲区长度来避免sprintf()存在的溢出风险

    ---------------------------------------------------

    1: fprintf()
    #include <stdio.h> 
    int fprintf( FILE *stream, const char *format, ... );
    fprintf()函数根据指定的format(格式)发送信息(参数)到由stream(流)指定的文件.因此fprintf()可以使得信息输出到指定的文件.比如
        char name[20] = "Mary";
        FILE *out;
        out = fopen( "output.txt", "w" );
        if( out != NULL )
        fprintf( out, "Hello %s ", name );
    对于其输出格式参数,和printf()一样.
    fprintf()和printf()一样工作. fprintf()的返回值是输出的字符数,发生错误时返回一个负值.
    在有些地方,有这样的定义:printf(...)=fprintf(stdout,...).

    2:eg)
    fprintf函数的用法!2007-12-13 21:46
    fprintf是用于文件操作的,原型是int fprintf( FILE *stream, const char *format [, argument ]...);

    举例用法:
    #include <stdio.h>
    #include <process.h>

    FILE *stream;

    void main( void )
    {
    int i = 10;
    double fp = 1.5;
    char s[] = "this is a string";
    char c = ' ';

    stream = fopen( "fprintf.out", "w" );
    fprintf( stream, "%s%c", s, c );

    fprintf( stream, "%d ", i );
    fprintf( stream, "%f ", fp );
    fclose( stream );
    system( "type fprintf.out" );
    }

    屏幕输出:

    this is a string
    10
    1.500000

    printf就是在屏幕打印出一段字符串来啊
    原型是int printf( const char *format [, argument]... );
    是标准输出。

    3:printf、sprintf与fprintf 的用法区分

    1.printf 是和标准输出文件(stdout)关联的,fprintf 则没有这个限制.
     
    2.fprintf是用于文件操作的,原型是int fprintf( FILE *stream, const char *format [, argument ]...);

    3.sprintf是格式化输出到一个字符串,fprintf是格式化输出到一个stream,通常是到文件。
     
    int   fprintf(   FILE   *stream,   const   char   *format   [,   argument   ]...);  
    int   sprintf(   char   *buffer,   const   char   *format   [,  argument]   ...   );

    -----------------------------------------------------------------------------------

  • 相关阅读:
    SQLite数据库框架ORMLite与GreenDao的简单比较
    Spring Web MVC中的页面缓存支持 ——跟我学SpringMVC系列
    admin嵌套在spring mvc项目里,菜单栏点击新连接每次都会重置
    Spring MVC视图层:thymeleaf vs. JSP
    使用Spring标签库
    SpringMVC中Controller跳转到另一个Controller方法
    有趣iOS开展
    Java日期的格式String类型GMT,GST换算成日期Date种类
    javascript之Style物
    Tair LDB基于Prefixkey中期范围内查找性能优化项目总结
  • 原文地址:https://www.cnblogs.com/riasky/p/3478493.html
Copyright © 2011-2022 走看看