在C中,从缓冲区的第n个字节开始将字节复制到缓冲区
我对C非常陌生,并且习惯了更高级的语言,比如JS和Python。我正在尝试将一些字节复制到另一个字节字符串中的某个位置 例如,如果我试图从目标字符串的第3个字节开始将src字符串复制到目标字符串中,它将如下所示:在C中,从缓冲区的第n个字节开始将字节复制到缓冲区,c,C,我对C非常陌生,并且习惯了更高级的语言,比如JS和Python。我正在尝试将一些字节复制到另一个字节字符串中的某个位置 例如,如果我试图从目标字符串的第3个字节开始将src字符串复制到目标字符串中,它将如下所示: src = "888" dest = "Hello World!" result = "He888 World!" 您可以尝试将其逐字节复制到目标字符串 strcpy(result, dest); for(in
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
相同的事情,要么传递不同的长度值时做错误的事情。值得注意的是,两者在安全性方面没有任何区别。但是,如果你想的话,你可以用一个循环来代替。