C ++:strcpy函数拷贝空?(C++: strcpy Function copies null

2019-07-30 19:23发布

当使用字符串处理函数specificaly 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一旦它到达空终止++停止outputing的字符串。 因此,空,必须在已经被复制strcpy功能。 造成这种字符串:

秒 - ü - P - \ 0 - Ø - P - O - \ 0;

请告诉我,如果这是正确与否。 如果我不是请指正。

如果您有任何更多的信息提供,请做。

Answer 1:

你的推理是正确的,会很容易被任何像样证实手册 :

所述strcpy()函数将字符串指向src ,包括终止空字节( '\0' ),到缓冲区指向dest



Answer 2:

你是对的。 对于您最初预期的效果,你可以使用strncopystrncopy副本空终止只要你指定所复制的字符串的正确长度。



Answer 3:

您关于终止字符的复制推理是正确的。 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 ,它不可能有好下场:-)


而就保持一件事记住重新您的评论“......造成这种字符串:■P u,\ 0 O P 2 O \ 0”。

不是一个字符串。 在C A的字符串(和C ++中的遗留串)被定义为一系列字符直到并包括第一 \0终止子。

您可能有一系列字符可达原(现为第二) \0 ,但实际上字符串比短。 这似乎有点迂腐,但明白的定义是很重要的。



Answer 4:

这是对的。

http://pubs.opengroup.org/onlinepubs/009695399/functions/strcpy.html

所述的strcpy()函数将复制字符串指向S2(包括终止空字节)到阵列指向S1。



Answer 5:

是的,这是正确的。 strcpy的将包括空终止符。 因为如果你的字符串复制到你想要的空默认情况下,终止了新的内存块是很重要的。 我相信strncpy()函数可能是你在这种情况下,后在做什么。

我也知道这只是测试代码,但我会在这一天小心,在字符串中使用+ X偏移的年龄...... ASCII常咬人在UTF8 / Unicode的世界,我们现在生活在后端。



Answer 6:

从该名男子页strcpy

所述strcpy()函数将字符串指向src ,包括终止空字节( '\0' ),到缓冲区指向dest 。 该字符串可能不重叠,目的串dest必须足够大,接收拷贝。



Answer 7:

是的,你是在你的推理正确,如果你将有明确的类型转换-ED第四字符“S1 [3]”因为这样的整数:

COUT <<(int)的S1 [3];

你会得到“0”作为其输出为NULL字符的ASCII值。



文章来源: C++: strcpy Function copies null?
标签: c++ string null