1.sprintf,sprintf_s
sprintf(char* buffer, const char* format, [argument]);
vs下需要加上_CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
int main()
{
char name[1];
int input = 9099;
sprintf(name,"%d", input);
system("pause");
}
这个貌似是典型的缓冲区溢出,程序崩溃,赋值超出了name的内存范围
sprintf_s是sprintf的安全版本,编译器都推荐使用这个
#include <iostream>
using namespace std;
int main()
{
char name[1];
int input = 9099;
sprintf_s(name, 1,"%d", input);
system("pause");
}
这个指定了缓冲区是1个字节大小,而将大于1字节大小的赋值到缓冲区中马上报错
而sprintf_s(name, 20,"%d", input);错误的将缓冲区的大小调到20,同样会造成内存溢出。所以要正确的指定缓冲区大小
#include <iostream>
using namespace std;
int main()
{
char name[1];
int input = 9099;
sprintf_s(name, "%d", input);
getchar();
}
同样会报错
任何企图将格式字符串输出小于本身长度的缓冲区中都会报错。
2.strcpy,strncpy,strcpy_s
char* strcpy(char* dest, const char* src);
把以Null字符结束的dest字符复制到dest指向的内存中,返回指向dest的指针
str与dest内存不能重叠且dest有足够的内存来存放stc的内容
#include <iostream>
using namespace std;
int main()
{
char* source = "123";
char name[2];
strcpy(name, source);
getchar();
}
会报错,因为dest的内存太小了
strncpy
char* strncpy(char* dest, char* src, int num);
如何提前遇到\0,则剩余的不全\0
#include <iostream>
using namespace std;
int main()
{
char des[]="Hello,iam!";
char source[]="abc\0def";
strncpy(des, source, 5);
getchar();
}
会不全\0
errno_t strcpy_s(char *strDestination, size_t numberOfElements, const char
*strSource );
这个也是指定缓冲区长度的复制方法
时间: 2024-11-05 14:48:36