当使用字符串处理函数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;
请告诉我,如果这是正确与否。 如果我不是请指正。
如果您有任何更多的信息提供,请做。
你的推理是正确的,会很容易被任何像样证实手册 :
所述strcpy()
函数将字符串指向src
,包括终止空字节( '\0'
),到缓冲区指向dest
。
你是对的。 对于您最初预期的效果,你可以使用strncopy
。 strncopy
副本空终止只要你指定所复制的字符串的正确长度。
您关于终止字符的复制推理是正确的。 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
,但实际上字符串比短。 这似乎有点迂腐,但明白的定义是很重要的。
这是对的。
http://pubs.opengroup.org/onlinepubs/009695399/functions/strcpy.html
所述的strcpy()函数将复制字符串指向S2(包括终止空字节)到阵列指向S1。
是的,这是正确的。 strcpy的将包括空终止符。 因为如果你的字符串复制到你想要的空默认情况下,终止了新的内存块是很重要的。 我相信strncpy()函数可能是你在这种情况下,后在做什么。
我也知道这只是测试代码,但我会在这一天小心,在字符串中使用+ X偏移的年龄...... ASCII常咬人在UTF8 / Unicode的世界,我们现在生活在后端。
从该名男子页strcpy
:
所述strcpy()
函数将字符串指向src
,包括终止空字节( '\0'
),到缓冲区指向dest
。 该字符串可能不重叠,目的串dest
必须足够大,接收拷贝。
是的,你是在你的推理正确,如果你将有明确的类型转换-ED第四字符“S1 [3]”因为这样的整数:
COUT <<(int)的S1 [3];
你会得到“0”作为其输出为NULL字符的ASCII值。