在使用特定字符串操作功能时,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;
请告诉我这是否正确.如果我不是请纠正我.
如果您有任何更多信息要提供,请做.
您关于复制终止字符的推理是正确的。C++ 标准(它是该语言的权威规范)在这方面遵循 C(例如,C++14 遵循 C99,而 C++17 遵循 C11)。
C11 标准是这样说的strcpy
:
7.24.2.3
strcpy
功能概要:
#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
但字符串实际上比原来的要短。这可能看起来有点迂腐,但理解定义很重要。
归档时间: |
|
查看次数: |
41762 次 |
最近记录: |