Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中,从缓冲区的第n个字节开始将字节复制到缓冲区_C - Fatal编程技术网

在C中,从缓冲区的第n个字节开始将字节复制到缓冲区

在C中,从缓冲区的第n个字节开始将字节复制到缓冲区,c,C,我对C非常陌生,并且习惯了更高级的语言,比如JS和Python。我正在尝试将一些字节复制到另一个字节字符串中的某个位置 例如,如果我试图从目标字符串的第3个字节开始将src字符串复制到目标字符串中,它将如下所示: src = "888" dest = "Hello World!" result = "He888 World!" 您可以尝试将其逐字节复制到目标字符串 strcpy(result, dest); for(in

我对C非常陌生,并且习惯了更高级的语言,比如JS和Python。我正在尝试将一些字节复制到另一个字节字符串中的某个位置

例如,如果我试图从目标字符串的第3个字节开始将src字符串复制到目标字符串中,它将如下所示:

src = "888"
dest = "Hello World!"
result = "He888 World!"

您可以尝试将其逐字节复制到目标字符串

 strcpy(result, dest);
    
 for(int i = start; i < strlen(src); i++)
 {
     result[i] = src[i - start];
 } 
strcpy(结果、目的);
对于(int i=start;i

开始是您的第n个字符。

基本复制,即您知道要复制多少字节、从何处获取字节以及将它们放在何处,可以通过以下方法完成:

#包括
char const*src=“888”;
char dest[]=“你好,世界!”;
memcpy(和dest[2],src,3);
//dest现在包含“He888世界!”
将3个字节从
src
复制到
&dest[2]
(比起始位置多出两个字节)。与C语言中的大多数内容一样,由您来确定操作是否有效

如果
src
的长度是可变的,则可以使用查找其长度:

char const*src=“1234”;
char dest[]=“你好,世界!”;
memcpy(&dest[2],src,strlen(src));
//dest现在包含“He1234World!”
如果要将结果作为两个输入的单独字符串生成,可以为字符串的副本分配内存,并在进行任何更改之前使用复制(必须使用
free
释放此内存):

#包括
#包括
#包括
char const*src=“1234”;
char const*dest=“你好,世界!”;
char*result=strdup(dest);
如果(结果==NULL){
fputs(“分配内存失败”,stderr);
返回退出失败;
}
memcpy(&结果[2],src,strlen(src));
//结果现在包含“He1234World!”
自由(结果);
如果不能保证
src
将适合
dest
,您将体验避免整数溢出的奇妙世界:

size\u t offset=2;
如果(偏移>strlen(dest)| strlen(src)>strlen(dest)-偏移){
fprintf(
斯特德尔,
“src(%zu字节)太长,无法复制到偏移量%zu处的dest(%zu字节)”,
strlen(src)、strlen(dest)、offset
);
返回退出失败;
}
memcpy(&result[offset],src,strlen(src));

希望这对您的目的不是必需的。

请参阅memcpy或memmoveUse
dest+2
以指定它应该从目标的第三个字节开始。而
strlen(src)
是要复制的字节数。您还需要检查副本是否适合目标,C不会自动为您执行此操作。将
strlen
放入
for
循环的条件表达式中非常缓慢。它将运行时间从O(n)更改为O(n^2)。更好的是:
int len=strlen(src);for(inti=start;i
非常不起眼。它本质上是
while(len--)*d++=*s++
对于字符串函数(我已经厌倦了争论),至少你有一些安全的外表。memcpy是迄今为止我在开发中看到的最“我可以编写得更好”的函数(无论是好是坏…)。如果操作正确,它会尽可能地复制机器字大小而不是字节。@RobertHarvey:嗯,你从来没有成功地为
strncpy
辩护过。正如我之前所说,当传递相同的长度值时(但不太明显,效率也不高),它要么做与
memcpy
相同的事情,要么传递不同的长度值时做错误的事情。值得注意的是,两者在安全性方面没有任何区别。但是,如果你想的话,你可以用一个循环来代替。