首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >_tcsncpy_s()是否覆盖旧内容?

_tcsncpy_s()是否覆盖旧内容?
EN

Stack Overflow用户
提问于 2012-05-24 03:34:29
回答 1查看 2.6K关注 0票数 2

在字符串上多次使用_tcsncpy_s()会覆盖旧内容吗?或者它会创建新内容,然后指向新内容?举个简单的例子,如果我有:

代码语言:javascript
复制
    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,该怎么办?会发生什么不同的事情吗?还有没有其他可能有用的信息?

感谢您抽出时间,祝您愉快。

EN

回答 1

Stack Overflow用户

回答已采纳

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

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

最后,字符串复制和连接的变体以及中间的n最多只能从源文件读取n字符。这种设计允许程序员编写安全的代码(因此也允许编写prevent buffer overflows)。

哦,在我们忘记之前,如果您正在使用C++,您应该忘记所有C风格的字符串操作,简单地切换到更整洁、更容易使用的std::string (或者根据情况使用std::wstring )。字符串复制是通过简单的赋值(即=就足够了)进行的,而连接同样是惯用的(也就是+=就足够了)。有关更多信息,请查看the documentation

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10726646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档