_tcsncpy_s() 覆盖旧内容
_tcsncpy_s() write over old content?
多次对字符串使用 _tcsncpy_s(( 会覆盖旧内容吗?还是创建新内容,然后指向新内容?举个简单的例子,如果我有:
LPTSTR myString = new TCHAR[MAX_PATH];
LPTSTR copiedString1 = "Hello";
LPTSTR copiedString2 = "Rock";
_tcsncpy_s(myString,MAX_PATH,copiedString1,5); //1
//delete [] myString; //3
//LPTSTR myString = new TCHAR[MAX_PATH]; //3
_tcsncpy_s(myString,MAX_PATH,copiedString2,4); //2
我在 1 处理解:我们有 myString --> 'H
' 'e' 'l' 'l' 'o'但是在第2点:"R"o"c"k"是否被复制到"H"e"l">l"上,而"o"仍然存在?还是它现在指向内存中的新区域?我需要像 3 一样删除并重新创建 myString 吗?如果我先复制了 String2,然后复制了 String1,该怎么办?有什么不同的事情发生吗?还有什么可能有用的信息吗?
感谢您抽出宝贵时间,祝您有美好的一天。
但是在第 2 点:"R"o"c"k"是否被复制到"H"e"l"l"上, 而"O"仍然存在?
是的。阅读文档:
这些函数尝试将 strSource 的前 D 个字符复制到 strDest,其中 D 是计数和 strSource 长度的较小者。如果这些 D 字符适合 strDest(其大小以 numberOfElements 的形式给出(并且仍然为空终止符留出空间,则复制这些字符并附加终止空值;否则,strDest[0] 设置为空字符并调用无效的参数处理程序,如参数验证中所述。
现在,对于您的其他问题:
还是它现在指向内存中的新区域?
不,mystring
仍然引用同一个数组。
我做 需要像 3 一样删除并重新创建 myString?
也许。取决于你想做什么。如果你想要两个字符串的副本,那么是的,你将需要两个字符数组(静态或动态(。
如果我有怎么办 首先复制字符串2,然后复制字符串1?
在这种情况下,你会得到Rock
作为你的字符串。
有什么不同之处 发生?
操作后mystring
中存在不同的字符串,所以是的。
还有什么可能有用的信息吗?
是否要连接这两个字符串?如果是这样,请使用串联函数,例如 strcat
。另请注意,以下划线开头的函数是非标准的、特定于供应商的函数,因此很可能不可移植。尝试使用标准定义的函数(如strncpy
、strcat
、strncat
等(。
MS 世界中_t
前缀函数通常是宏,它们根据您的项目设置(即是否已定义UNICODE
/_UNICODE
预处理器宏(切换到相应函数的相应 ASCII/Unicode 版本。
最后,字符串复制和串联的变体与中间的n
最多读取源n
个字符。这种设计允许程序员编写安全代码(从而防止缓冲区溢出(。
哦,在我们忘记之前,如果你正在使用C++,你应该忘记所有关于 C 风格的字符串操作,只需切换到更整洁、更易于使用的std::string
(或std::wstring
视情况而定(。字符串复制通过简单的赋值(即 =
足够了(,连接同样是惯用的(即 +=
就足够了(。有关详细信息,请查看文档。
- 使用ios:ate写入到流会覆盖现有文件
- 我可以重新分配/覆盖std::字符串吗
- 叮叮当当在修复时插入多个"覆盖"说明符
- 谷歌模拟和覆盖关键字
- TMap::Emplace() 在应用现有密钥时会覆盖吗?
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 使用子类覆盖基类中定义的函数
- 当覆盖存在时调用基本虚拟"binded to object"函数
- C++指针在 for 循环中被覆盖
- "main"函数堆栈中的对象在第一个任务运行时被覆盖 (FreeRTOS)
- 为什么我的全局 new() 覆盖被绕过了?
- 被覆盖的函数不会反映在基类中,这是正常行为吗?
- C++找出覆盖同一行的数组
- 专门化模板覆盖函数/避免对象切片
- 重写打印函数而不是覆盖基类
- C++中"覆盖功能的异常规范比基本版本更宽松"的奇怪错误
- 如何在 c++ 中覆盖相同的文本文件
- 覆盖应用程序的低级别键盘挂钩问题
- glBindTexture 是否覆盖活动纹理单元的内容
- "虚拟""覆盖"析构函数