对字符串多次使用_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,该怎么办?有什么不同吗?还有什么可能有用的知识吗?
感谢您的时间,祝您度过愉快的一天。
答案 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
。另请注意,以下划线开头的函数是非标准的,特定于供应商的函数,因此不可能完全移植。尝试使用标准定义的函数(例如strncpy
,strcat
,strncat
等。)
MS世界中的_t
前缀函数通常是根据项目设置切换到相应函数的相应ASCII / Unicode版本的宏(即UNICODE
/ _UNICODE
是否定义了预处理器宏。)
最后,字符串复制和串联与n
之间的变化从源中读取最多n
个字符。这种设计允许程序员编写安全代码(因此prevent buffer overflows)。
哦,在我们忘记之前,如果你正在使用C ++,你应该忘记所有关于C风格的字符串操作并简单地切换到更整洁,更容易使用std::string
(或{{1} } 视情况可以是)。字符串复制通过简单的赋值(即std::wstring
足够)发生,并且连接同样是惯用的(即=
就足够了)。如需更多检查the documentation。