C++:strcpy函数复制null?

Moh*_*bil 18 c++ string null

在使用特定字符串操作功能时,strcpy我做了这个小程序.

char s1[8]="Hellopo";
char s2[4]="sup";
strcpy(s1,s2);
cout<<s1<<endl;
Run Code Online (Sandbox Code Playgroud)

当我打印出s1它实际上只打印出"sup".我期待它打印"suplopo".

然后我这样做了:

cout<<s1+4 << endl;

它打印出"opo";

而这个的输出:cout<<s1+3<<endl; 什么都没有

在思考了一下之后.

我得出了这个结论.由于C++在到达空终止符后停止输出字符串.因此必须在strcpy函数中复制null .导致此字符串:

s - u - p - \0 - o - p - o - \0;

请告诉我这是否正确.如果我不是请纠正我.

如果您有任何更多信息要提供,请做.

Ker*_* SB 34

你的推理是正确的,并且很容易被任何体面的手册证实:

strcpy()函数将指向的字符串src(包括终止空字节('\0'))复制到指向的缓冲区dest.


pax*_*blo 5

您关于复制终止字符的推理是正确的。C++ 标准(它是该语言的权威规范)在这方面遵循 C(例如,C++14 遵循 C99,而 C++17 遵循 C11)。

C11 标准是这样说的strcpy

7.24.2.3strcpy功能

概要:

#include <string.h>
char *strcpy(char * restrict s1, const char * restrict s2);

描述:

strcpy函数将 指向的字符串s2(包括终止空字符)复制到 指向的数组中s1。如果复制发生在重叠的对象之间,则行为未定义。

返回:

strcpy函数返回 的值s1

如果您只想替换字符串的前三个字符,您可以使用memcpy()复制特定数量的字节:

memcpy(s1, s2, strlen(s2));
Run Code Online (Sandbox Code Playgroud)

请记住,这只会复制这些字节,仅此而已。如果s1不是至少长度为 的字符串s2,则不太可能结束:-)


请记住一件事,即您的评论“...导致此字符串:sup\0opo\0”。

不是字符串。C 中的字符串(以及 C++ 中的旧字符串)被定义为直到并包括第一个 \0终止符的一系列字符。

您可能有一系列字符直到原始字符(现在是第二个字符),\0字符串实际上比原来的要短。这可能看起来有点迂腐,但理解定义很重要。