English 中文(简体)
_tcscsncpy_s () 在旧内容上写入吗?
原标题:_tcsncpy_s() write over old content?
  • 时间:2012-05-23 19:34:28
  •  标签:
  • c++
  • strcpy

在字符串上多次使用 _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: 1: 我们有我的String - & gt; H e l l o

但是在第2点:R o c k 是否被复制到 H e l l 上, 而 o 留下? 或者它现在指向记忆中的新区域? 难道我需要删除并像在 3 中那样重新创建我的String 吗? 如果我先复制String2 然后复制String1 呢? 有什么不同吗?还有什么其他有用的信息吗?

感谢您抽出时间 祝你今天愉快

最佳回答

But at point 2: Does R o c k get copied over H e l l , while o remains?

是的,阅读"http://msdn.microsoft.com/en-us/library/5dae5d43%28v=vs.80%29.aspx" rel=“nofollow”>文件:

这些函数试图复制字符串源的第一个 D 字符到 strDest, 其中 D 是小数数和字符串源长度。 如果这些 D 字符将适合 strDest (其大小被标为数字元素), 并且仍然为无效终止符留有空间, 那么这些字符将被复制, 并附加一个终止符; 否则, strDest [0] 设置为无效字符, 并引用参数无效处理器, 正如参数校验中所描述的 。

现在,关于你的其他问题:

还是现在它指向了记忆中的新领域?

否, mystring 仍指相同的数组。

Do I need to delete and recreate myString like in 3?

。也许。取决于您想要做什么。如果您想要两个字符串的副本,那么是的,您需要两个字符组(静态或动态)。

What if I have copiedString2 first and then copiedString1?

在这种情况下,您可以将 Rock 作为字符串。

Does anything different happen?

操作后 mystring 中存在不同的字符串,所以是的。

还有什么有用的信息吗?

您想要将这两个字符串混在一起吗? 如果是的话, 请使用连接功能, 如 < code>strcat 。 另外, 请注意, 以强调开头的函数是非标准、 供应商特定功能, 因而不可能完全被移动。 尝试使用一个标准定义函数( 如 < code>strcpy 、 < code> start 、 < code> strcat 等 )。

MS World 中 前缀函数通常是转换到适合的 ASCII/Unicode 函数版本的宏,取决于您的项目设置(即 UNICODE ///UNICODE 预处理器宏是否已经定义)。

最后,字符串复制件和连接字符串的变异,在源代码中读取的字符最多为n 。这种设计使程序员能够写入安全代码(因此