_tcsncpy_s() 覆盖旧内容

_tcsncpy_s() write over old content?

本文关键字:覆盖 tcsncpy      更新时间:2023-10-16

多次对字符串使用 _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 。另请注意,以下划线开头的函数是非标准的、特定于供应商的函数,因此很可能不可移植。尝试使用标准定义的函数(如strncpystrcatstrncat等(。

MS 世界中_t前缀函数通常是宏,它们根据您的项目设置(即是否已定义UNICODE/_UNICODE预处理器宏(切换到相应函数的相应 ASCII/Unicode 版本。

最后,字符串复制和串联的变体与中间的n最多读取源n个字符。这种设计允许程序员编写安全代码(从而防止缓冲区溢出(。

哦,在我们忘记之前,如果你正在使用C++,你应该忘记所有关于 C 风格的字符串操作,只需切换到更整洁、更易于使用的std::string(或std::wstring视情况而定(。字符串复制通过简单的赋值(即 = 足够了(,连接同样是惯用的(即 +=就足够了(。有关详细信息,请查看文档。