这是来自C++ Primer第5版。他们所说的“largeStr
的大小”是什么意思?largeStr
是std::string
的一个实例,所以它们具有动态大小?
此外,我不认为代码编译:
#include <string>
#include <cstring>
int main()
{
std::string s("test");
const char ca1[] = "apple";
std::strcpy(s, ca1);
}
我是不是遗漏了什么?
发布于 2022-06-01 14:30:42
strcpy
和strcat
只对C字符串进行操作。这篇文章令人困惑,因为它描述了一个手动大小的C字符串,但没有显式显示.为了使第二个片段编译,largeStr
必须是与第一个片段中的变量不同的变量:
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
,我们希望这些大小足够大来保存结果。但是,这种方法“有可能出现严重错误”,因为strcpy
和strcat
没有强制执行100
的大小限制。
,我也不认为代码会编译.
如前所述,将s
更改为数组,它将编译。
#include <cstring>
int main()
{
char s[100] = "test";
const char ca1[] = "apple";
std::strcpy(s, ca1);
}
注意,我没有编写char s[] = "test";
。为"apple"
预留额外的空间是很重要的,因为它比"test"
长。
发布于 2022-06-01 14:19:29
你错过了
char largeStr[100];
或者类似的书没有提到。
您应该做的是忘记strcpy和strcat和C风格的字符串。只要记住如何使c++ std::string
从它们中脱颖而出,永远不要回头看。
https://stackoverflow.com/questions/72463360
复制相似问题