在字符串上多次使用_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我的理解是:我们有myString --> 'H‘'e’'l‘'l’'o‘
但是在第二点:'R‘'o’'c‘'k’会被复制到'H‘'e’'l‘l’而'o‘保持不变吗?或者它现在指向内存中的一个新区域?我是否需要像在3中那样删除并重新创建myString?如果我先使用copiedString2,然后使用copiedString1,该怎么办?会发生什么不同的事情吗?还有没有其他可能有用的信息?
感谢您抽出时间,祝您愉快。
发布于 2012-05-24 03:54:10
但是在点2:'R‘'o’'c‘'k’会被复制到'H‘'e’'l‘l',而'o’保持不变吗?
是。阅读documentation:
这些函数尝试将strSource的前D个字符复制到strDest,其中D是count和strSource的长度中较小的一个。如果这些D字符适合strDest (其大小为numberOfElements),并且仍为空终止符留出空间,则复制这些字符并附加终止空值;否则,将strDest设置为空值字符并调用无效参数处理程序,如参数验证中所述。
现在,对于你的其他问题:
,或者它现在指向内存中的一个新区域?
不,mystring仍然引用相同的数组。
我是否需要像在3中那样删除并重新创建myString?
也许吧。这取决于你想做什么。如果您想要两个字符串的副本,那么是的,您将需要两个字符数组(静态或动态)。
如果我先使用copiedString2,然后使用copiedString1,该怎么办?
在这种情况下,您将获得Rock作为字符串。
会发生什么不同的事情吗?
在操作之后,mystring中出现了一个不同的字符串,所以是的。
还有什么可能有用的信息吗?
是否要连接这两个字符串?如果是,请使用连接函数,例如strcat。另外,请注意,以下划线开头的函数是非标准的、特定于供应商的函数,因此不可能是可移植的。尝试使用标准定义的函数(如strncpy、strcat、strncat等)。
MS中的_t前缀函数通常是根据项目设置(即是否定义了UNICODE/_UNICODE预处理器宏)切换到相应函数的适当ASCII码/Unicode版本的宏。
最后,字符串复制和连接的变体以及中间的n最多只能从源文件读取n字符。这种设计允许程序员编写安全的代码(因此也允许编写prevent buffer overflows)。
哦,在我们忘记之前,如果您正在使用C++,您应该忘记所有C风格的字符串操作,简单地切换到更整洁、更容易使用的std::string (或者根据情况使用std::wstring )。字符串复制是通过简单的赋值(即=就足够了)进行的,而连接同样是惯用的(也就是+=就足够了)。有关更多信息,请查看the documentation。
https://stackoverflow.com/questions/10726646
复制相似问题