c - 在不同的 char 数组上调用 strcpy 时,char 数组的值发生变化
问题描述
在尝试将字符串复制到 C 样式数组的方法时,由于一些奇怪的限制,我偶然发现了这种奇怪的行为,首先尝试复制字符串std::string::copy()
似乎工作正常,直到我尝试将相同的字符串从另一个变量复制到另一个空 C 样式数组std::strcpy()
,然后第一个数组中的内容从字符串中获取一些剩余内容。
#include <iostream>
#include <string>
#include <algorithm>
#include "string.h"
int main()
{
std::string str = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut l";
std::string str2 = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut l";
char cstr[64] = {0};
char cstr2[64] = {0};
str.copy(cstr, std::min(str.size(), sizeof(cstr) / sizeof(cstr[0]) - 1));
// cstr: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed di"
std::cout << "cstr: \"" << cstr << "\"" << std::endl;
strcpy(cstr2, str2.c_str());
cstr2[sizeof(cstr2) / sizeof(cstr2[0]) - 1] = '\0';
// cstr: "m nonumy eirmod tempor invidunt ut l"
std::cout << "cstr: \"" << cstr << "\"" << std::endl;
// cstr2: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed di"
std::cout << "cstr2: \"" << cstr2 << "\"" << std::endl;
return 0;
}
当然,我只是在这里遗漏了一些愚蠢的关键点。
解决方案
在第一种情况下
str.copy(cstr, std::min(str.size(), sizeof(cstr) / sizeof(cstr[0]) - 1));
您通过 的值限制了复制字符的数量sizeof( cstr ) - 1
。
所以数组cstr
包含一个字符串,因为它是零初始化的。
在第二种情况下,您没有限制复制字符的数量。
strcpy(cstr2, str2.c_str());
因此,数组之外的内存cstr2
被覆盖,因为 指向的字符串str2.c_str()
包含的字符多于数组的大小cstr2
。
相反,你可以写
strncpy( cstr2, str2.c_str(), sizeof( cstr2 ) - 1 );
使用功能strncpy
。
推荐阅读
- vba - 我的“更干净”代码运行速度比宏录制版本慢
- scikit-learn - 最佳发现的 PCA 估计器将用作 RFECV 中的估计器
- python - 如何在python中从谷歌云存储中的非默认存储桶中读取
- java - 添加到 Android Studio 中的列表,性能问题
- python - 如何通过 Django RestFramework 中的 URL 过滤嵌套列表
- python - 如何使用请求生成 API 令牌
- sql - 当用户具有“授予所有”权限和宽松政策时,如何使用 RLS 将记录插入 Postgres
- python - 如何导入*.pyd文件python(Linux机器)
- javascript - Javascript 中的本地存储
- ios - 如何在 UIElements 上正确使用占位符 API