2

是否在字符串上多次使用 _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 --> 'H' 'e' 'l' 'l' 'o'

但是在第 2 点: 'R' 'o' 'c' 'k' 是否被复制到 'H' 'e' 'l' 'l' 上,而 'o' 仍然存在?还是它现在指向内存中的一个新区域?我需要像 3 那样删除并重新创建 myString 吗?如果我先复制了String2,然后复制了String1,该怎么办?会发生什么不同的事情吗?还有什么可能有用的知道吗?

感谢您的宝贵时间,祝您有美好的一天。

4

1 回答 1

3

但是在第 2 点: 'R' 'o' 'c' 'k' 是否被复制到 'H' 'e' 'l' 'l' 上,而 'o' 仍然存在?

是的。阅读文档

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

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

还是它现在指向内存中的一个新区域?

不,mystringis 仍然是指同一个数组。

我需要像 3 那样删除并重新创建 myString 吗?

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

如果我先复制了String2,然后复制了String1,该怎么办?

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

会发生什么不同的事情吗?

操作后出现不同的字符串mystring,所以是的。

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

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

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

最后,字符串复制和连接n之间的变化从源中读取最多n字符。这种设计允许程序员编写安全代码(从而防止缓冲区溢出)。

哦,在我们忘记之前,如果您使用的是 C++,您应该忘记所有关于 C 风格的字符串操作,并简单地切换到更简洁、更易于使用std::string(或std::wstring视情况而定)。字符串复制通过简单的赋值(即=足够)发生,并且连接同样是惯用的(即+=足够)。有关更多信息,请查看文档

于 2012-05-23T19:54:10.310 回答