在使用特定字符串操作函数strcpy
时,我做了这个小程序。
char s1[8]="Hellopo";
char s2[4]="sup";
strcpy(s1,s2);
cout<<s1<<endl;
当我打印出s1时它实际上只打印出“sup”。我希望它能打印出“suplopo”。
然后我这样做了:
cout<<s1+4 << endl;
打印出“opo”;
这个输出:cout<<s1+3<<endl;
没什么
所以在思考了一下之后。
我得出了这个结论。由于C ++在到达空终止符后停止输出字符串。因此必须在strcpy
函数中复制null。导致这个字符串:
s - u - p - \ 0 - o - p - o - \ 0;
请告诉我这是否正确。如果我不能请纠正我。
如果您有任何更多信息要提供,请做。
答案 0 :(得分:33)
你的推理是正确的,很容易被任何体面的manual确认:
strcpy()
函数将src
指向的字符串(包括终止空字节('\0'
))复制到dest
指向的缓冲区。
答案 1 :(得分:2)
你是对的。对于您最初预期的效果,您将使用strncopy
。只要指定了正在复制的字符串的正确长度,strncopy
就会复制空终止符。
答案 2 :(得分:2)
关于复制终止字符的理由是正确的。 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));
请记住,这只会复制这些字节,仅此而已。如果s1
已经不是s2
长度的字符串,则不太可能结束: - )
请记住一件事你的评论&#34; ...产生这个字符串: s u p < KBD> \ 0 0 p 0 \ 0 &#34;
那是不是一个字符串。 C中的字符串(以及C ++中的旧字符串)被定义为一系列字符,包括第一个 \0
终止符。
你可能有一系列字符,直到最初的(现在是第二个)\0
,但字符串实际上比这短。这可能似乎有点迂腐但理解这些定义很重要。
答案 3 :(得分:1)
来自strcpy
的手册页:
strcpy()
函数复制src
指向的字符串, 包括终止空字节('\0'
)到指向的缓冲区 按dest
。字符串可能不重叠,并且目标字符串dest
必须足够大才能收到副本。
答案 4 :(得分:1)
这是正确的。
http://pubs.opengroup.org/onlinepubs/009695399/functions/strcpy.html
strcpy()函数应复制s2指向的字符串 (包括终止空字节)到s1指向的数组中。
答案 5 :(得分:1)
是的,这是正确的。 strcpy将包含null终止符。重要的是,如果将字符串复制到新的内存块,您希望它默认为null。我相信strncpy可能就是你在这种情况下所追求的。
另外我知道这只是测试代码但是我在这个时代要小心使用字符串中的+ X偏移... ascii通常会在utf8 / unicode世界的后端咬人我们现在住在。
答案 6 :(得分:0)
是的,您的推理是正确的,如果您将第4个字符“ s1 [3]”显式转换为整数,则像这样:
cout <<(int)s1 [3];
您将获得“ 0”作为输出,它是NULL字符的ASCII值。