_tcsncpy_s()写过旧内容?

时间:2012-05-23 19:34:29

标签: 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:我们有myString - > '我''''''''''o'

但在第2点:'R''o''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''或者它现在指向内存中的新区域?我是否需要像3中那样删除并重新创建myString?如果我先复制了String2然后复制了String1,该怎么办?有什么不同吗?还有什么可能有用的知识吗?

感谢您的时间,祝您度过愉快的一天。

1 个答案:

答案 0 :(得分:3)

  

但是在第2点:'R'''''''''''''''''''''''''''''''''''''''''''''''''''''''   而'o'仍然存在?

是。阅读documentation

  

这些函数尝试将strSource的前D个字符复制到strDest,其中D是count的较小者和strSource的长度。如果这些D字符符合strDest(其大小以numberOfElements给出)并仍为空终止符留出空间,则复制这些字符并附加终止空值;否则,strDest [0]设置为空字符,并调用无效参数处理程序,如参数验证中所述。

现在,针对您的其他问题:

  

或者它现在指向内存中的新区域?

不,mystring仍然引用相同的数组。

  

我   需要删除和重新创建myString,如3?

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

  

如果我有   首先是copiedString2然后是copiedString1吗?

在这种情况下,你会得到Rock作为你的字符串。

  

有什么不同   发生?

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

  

还有什么可能有用的知识吗?

你想连接这两个字符串吗?如果是,请使用连接函数,例如strcat。另请注意,以下划线开头的函数是非标准的,特定于供应商的函数,因此不可能完全移植。尝试使用标准定义的函数(例如strncpystrcatstrncat等。)

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

最后,字符串复制和串联与n之间的变化从源中读取最多n个字符。这种设计允许程序员编写安全代码(因此prevent buffer overflows)。

哦,在我们忘记之前,如果你正在使用C ++,你应该忘记所有关于C风格的字符串操作并简单地切换到更整洁,更容易使用std::string(或{{1} } 视情况可以是)。字符串复制通过简单的赋值(即std::wstring足够)发生,并且连接同样是惯用的(即=就足够了)。如需更多检查the documentation