• [转][修]sprintf()函数:将格式化的数据写入字符串


    头文件:#include <stdio.h>
    功能:用于将格式化的数据写入字符串

    原型:int sprintf(char *str, char * format [, argument, ...]);
    【参数】str为要写入的字符串;format为格式化字符串,与printf()函数相同;argument为变量。除了前两个参数类型固定外,后面可以接任意多个参数。
    【返回值】成功则返回参数str 字符串长度,失败则返回-1,错误原因存于errno 中。

    sprintf()最常见的应用之一莫过于把整数打印到字符串中,如:
        sprintf(s, "%d", 123);  //把整数123打印成一个字符串保存在s中
        sprintf(s, "%8x", 4567);  //小写16进制,宽度占8个位置,右对齐

    注意:C语言对数组进行操作时并不检测数组的长度,如果str的长度不够,sprintf()很容易造成缓冲区溢出,带来意想不到的后果,黑客经常利用这个弱点攻击看上去安全的系统。例如:
    #include <stdio.h>
    main()
    {
        char buf[10];
        sprintf(buf, "The length of the string is more than 10");
        printf("%s", buf);
    }
    编译并运行,屏幕上输出”The length of the string is more than 10“,同时系统提示程序已经停止。原因就是要写入的字符串的长度超过了buf的长度,造成缓冲区溢出。使用snprintf()来代替sprintf()将能够很好的解决这个问题。
     
    【例一】打印字母a的ASCII值。
     
    #include <stdio.h>
    main()
    {
        char a = 'a';
        char buf[80];
        sprintf(buf, "The ASCII code of a is %d.", a);
        printf("%s", buf);
    }
    运行结果:The ASCII code of a is 97.
     
    【例二】产生10个100以内的随机数并输出
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    int main(void)
    {
        char str[100];
        int offset =0;
        int i=0;
        srand(time(0));  // *随机种子
        for(i = 0;i<10;i++)
        {
            offset+=sprintf(str+offset,"%d,",rand()%100);  // 格式化的数据写入字符串
        }
        str[offset-1]='
    ';
        printf(str);
        return 0;
    }
    运行结果: 74,43,95,95,44,90,70,23,66,84
    例子使用了一个新函数srand(),它能产生随机数。例子中最复杂的部分是for循环中每次调用函数sprintf()往字符数组写数据的时候,str+foffset为每次写入数据的开始地址,最终的结果是所有产生的随机数据都被以整数的形式存入数组中。
  • 相关阅读:
    NEFU84——五指山(Exgcd)
    Scoi2010——传送带(三分套三分=九分)
    POJ3352Road construction(边双联通分量)
    CEOI2005——关键网线(割边)
    ZJOI2004——嗅探器
    POJ1845s——Sumdiv()
    Web 服务器安全
    渗透测试神器Cobalt Strike的使用
    Windows中的用户和组以及用户密码处理
    漏洞及渗透练习平台 【大全】
  • 原文地址:https://www.cnblogs.com/stxs/p/8809065.html
Copyright © 2020-2023  润新知