zoukankan      html  css  js  c++  java
  • windows下_snprintf用法

    windows下的_snprintf

    声明格式:

    int _snprintf(char *buffer, size_t count, const char *format [,argument ] ...);

    假设:源字符串长度len ,目的串为str ,count为要拷贝的字符个数

    如果len < count ,则将源串拷贝到目的串str中,后面再加个空字符 ,返回值为源串长度len,

    len = count ,将源串拷贝到目的串str中,后面不自动加空字符,返回值是源串长度len

    len > count 截取源串count长度的子串拷贝到目的串str中,后面不自动加空字符,返回值是 -1 .

    综上,为了更安全的使用_snprintf,我们人为的加上空字符,

    正确示例为:

    int main()
    {
        char str[10];
        //表示最后一位留给空字符
        const char *s = "hello";
        //如果源串较长,大于目的穿,拷贝字符串长度设置为sizeof(str)-1,
        int ret = _snprintf(str, sizeof(str)-1, "test:%s", s);
        //在尾部加上空字符
        str[sizeof(str)-1] = 0;
        cout << "sizeof(str) = " << sizeof(str) << endl;
        //strlen()查找字符个数,遇到空字符 ‘’停止
        cout << "strlen(str) = " << strlen(str)<<endl;
        cout << "return value = " << ret << endl;
        cout << endl;
        cout <<"str[]的内容: ";
        for (int i = 0;i < 10;i++)
        {
            cout << str[i];
        }
        cout <<endl;
        cout << endl;
        
    }

    输出:

    空字符不算作长度,拷贝指定长度的字符串

    总结:无论源串长度时都大于目的串,我们总是人为的在尾部加上空字符就好了。

    保持这样的写法:

    int ret = _snprintf(str, sizeof(str)-1, "test:%s", s);
    str[sizeof(str)-1] = 0;

    附:Linux下是snprintf

    函数名不一样,自己写一个snprintf,调用_snprintf,然后再VC++编译的时候启用

    为了跨平台,重新定义一个snprintf,就可以接着使用 _snprintf,不过还没有试验。。。

    #ifdef __GNUC__
    #define _snprintf snprintf
    #endif

     

  • 相关阅读:
    避免Eclipse经常出现Out Of Memory
    java 判断类和实例的关系(instanceof,isInstance,isAssignableFrom)
    Tuscany SCA Core实现的SPI机制
    ubuntu下压缩和解压缩的命令用法
    eclipse 中引用其他项目及项目打包
    Tuscany 源码学习(1)
    Eclipse快捷键大全(转载)
    zz linux下用 SCP 命令进行网络传输
    HZNUACM寒假集训Day5小结 线段树 树状数组
    HZNUACM寒假集训Day1小结 STL 并查集
  • 原文地址:https://www.cnblogs.com/strivingforever/p/8686366.html
Copyright © 2011-2022 走看看