首页 > 其他 > 详细

字符串系列函数(不断跟新)

时间:2014-05-20 01:32:41      阅读:376      评论:0      收藏:0      [点我收藏+]

1.sprintf,sprintf_s

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

vs下需要加上_CRT_SECURE_NO_WARNINGS

bubuko.com,布布扣
#include <iostream>
using namespace std;
int main()
{
    char name[1];
    int input = 9099;
    sprintf(name,"%d", input);
    system("pause");
}
bubuko.com,布布扣

这个貌似是典型的缓冲区溢出,程序崩溃,赋值超出了name的内存范围

sprintf_s是sprintf的安全版本,编译器都推荐使用这个

bubuko.com,布布扣
#include <iostream>
using namespace std;
int main()
{
    char name[1];
    int input = 9099;
    sprintf_s(name, 1,"%d", input);
    system("pause");
}
bubuko.com,布布扣

这个指定了缓冲区是1个字节大小,而将大于1字节大小的赋值到缓冲区中马上报错

而sprintf_s(name, 20,"%d", input);错误的将缓冲区的大小调到20,同样会造成内存溢出。所以要正确的指定缓冲区大小

bubuko.com,布布扣
#include <iostream>
using namespace std;
int main()
{
    char name[1];
    int input = 9099;
    sprintf_s(name, "%d", input);
    getchar();
}
bubuko.com,布布扣

同样会报错

任何企图将格式字符串输出小于本身长度的缓冲区中都会报错。

2.strcpy,strncpy,strcpy_s

char* strcpy(char* dest, const char* src);

把以Null字符结束的dest字符复制到dest指向的内存中,返回指向dest的指针

str与dest内存不能重叠且dest有足够的内存来存放stc的内容

bubuko.com,布布扣
#include <iostream>
using namespace std;
int main()
{
    char* source = "123";
    char name[2];
    strcpy(name, source);
    getchar();
}
bubuko.com,布布扣

会报错,因为dest的内存太小了

strncpy

char* strncpy(char* dest, char* src, int num);

如何提前遇到\0,则剩余的不全\0

bubuko.com,布布扣
#include <iostream>
using namespace std;
int main()
{
    char des[]="Hello,iam!";
    char source[]="abc\0def";
    strncpy(des, source, 5);
    getchar();
}
bubuko.com,布布扣

会不全\0

errno_t strcpy_s(char *strDestination, size_t numberOfElements, const char *strSource );

这个也是指定缓冲区长度的复制方法

字符串系列函数(不断跟新),布布扣,bubuko.com

字符串系列函数(不断跟新)

原文:http://www.cnblogs.com/zzyoucan/p/3731141.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!