码迷,mamicode.com
首页 > 其他好文 > 详细

stncpy 函数

时间:2014-08-18 18:43:42      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   os   io   文件   

C++中, 字符串处理的c style相关函数定义在头文件 <cstring>中。

strncpy()函数:

   函数的prototype: 

char * strncpy ( char * destination, const char * source, size_t num );   

      作用: 将source 内部存储的字符串的前num 个字符拷贝到 destination 指向的存储字符串的地址中。  如果source 内部的存储的c string 的含有的字符个数小于num的时候, 也就是说, 在copy 的过程中, 遇到了NULL character(即‘/0’, 还记得吗, 对于c style 的string 而言, 结尾是默认用‘\0’填充的, 以表示字符串结束的位置)destination 内部没有被填满(占用)的用‘0’ 填充, 直至完成达到num 的个数。

如果source字符串的字符的个数超过num个, 那么在复制num 个字符到destination的时候,  那么字符串destination 在复制的时候, 结尾并不会隐式的(implicitly)假如‘\0’亦signal 这个 c string 的结束位置。 于是destination shall not be considered a null terminated C string。 如果我们读取这个这种类型的c string的字符串, 将会产生溢出错误 (reading it as such would overflow)。 所以一般我们会手动的在destination的末尾加入一个‘\0’(空字符)

    返回值: 该函数返回的是destination。


    注意事项:destination 和 source 不应该 overlap, 否则就是内存覆盖错误 .


举一个例子:


</pre><pre name="code" class="cpp">#include <iostream>
#include <cstring> // for c style string manipulation

using namespace std;

int main ()
{
    char str1[]= "To be or not to be";
    char str[] = "HE";  // 默认结尾有 '\0'
    cout << sizeof(str) << endl;
    char str2[40];
    char str3[40];

    /* copy to sized buffer (overflow safe): */
    strncpy ( str2, str1, sizeof(str2) );

    /* partial copy (only 5 chars): */
    strncpy ( str3, str2, 5 );
    str3[5] = '\0';   /* null character manually added */

    cout << str1 << endl;
    cout << str2 << endl;
    cout << str3 << endl;

    strncpy(str1 + 3, str1, 6); // 出现内存覆盖问题
    cout << str1 ;

    return 0;
}


在code::blocks 的两个快捷键:

CTRL + SHIFT + F9: 编译当前文件(而不是当前打开的工程项目)

CTRL + F10:  运行上次成功编译后的程序

编译运行结果如下:


bubuko.com,布布扣



stncpy 函数,布布扣,bubuko.com

stncpy 函数

标签:des   style   blog   http   color   os   io   文件   

原文地址:http://blog.csdn.net/a130737/article/details/38662695

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!