首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >std::strcpy和std::strcat与std::string参数

std::strcpy和std::strcat与std::string参数
EN

Stack Overflow用户
提问于 2022-06-01 14:15:52
回答 2查看 82关注 0票数 1

这是来自C++ Primer第5版。他们所说的“largeStr的大小”是什么意思?largeStrstd::string的一个实例,所以它们具有动态大小?

此外,我不认为代码编译:

代码语言:javascript
运行
复制
#include <string>
#include <cstring>

int main()
{
    std::string s("test");
    const char ca1[] = "apple";
    std::strcpy(s, ca1);
}

我是不是遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-01 14:30:42

strcpystrcat只对C字符串进行操作。这篇文章令人困惑,因为它描述了一个手动大小的C字符串,但没有显式显示.为了使第二个片段编译,largeStr必须是与第一个片段中的变量不同的变量:

代码语言:javascript
运行
复制
char largeStr[100];

// disastrous if we miscalculated the size of largeStr
strcpy(largeStr, ca1);        // copies ca1 into largeStr
strcat(largeStr, " ");        // adds a space at the end of largeStr
strcat(largeStr, ca2);        // concatenates ca2 onto largeStr

如第二段所述,largeStr是一个数组。数组在编译时决定了固定的大小,因此我们不得不选择一些任意大小,比如100,我们希望这些大小足够大来保存结果。但是,这种方法“有可能出现严重错误”,因为strcpystrcat没有强制执行100的大小限制。

,我也不认为代码会编译.

如前所述,将s更改为数组,它将编译。

代码语言:javascript
运行
复制
#include <cstring>

int main()
{
    char s[100] = "test";
    const char ca1[] = "apple";
    std::strcpy(s, ca1);
}

注意,我没有编写char s[] = "test";。为"apple"预留额外的空间是很重要的,因为它比"test"长。

票数 3
EN

Stack Overflow用户

发布于 2022-06-01 14:19:29

你错过了

代码语言:javascript
运行
复制
char largeStr[100];

或者类似的书没有提到。

您应该做的是忘记strcpy和strcat和C风格的字符串。只要记住如何使c++ std::string从它们中脱颖而出,永远不要回头看。

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

https://stackoverflow.com/questions/72463360

复制
相关文章

相似问题

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