通常我会strcpy
,但看起来我不能将较大尺寸复制到较小尺寸的数组。我知道我需要为它跳过一个数组元素,我想跳过第一个[0]
元素,但我怎么能这样做呢?我真的不想写类似a[39]=b[40]; a[38]=b[39]...
等的东西。
答案 0 :(得分:11)
std::strncpy(a, b + 1, 40);
即使b
中的最后一个字符不是'\0'
,或者索引'\0'
处的某个地方有i
,它也会有效。
strncpy
和a
不被视为 cstring ,则 b
特别有用,而不是缓冲区哪些可能包含或不包含'\0'
。
在C ++中,您还可以将std::copy
用作:
#include <algorithm> //include this!
std::copy(b + 1, b + 41, a); //b + 41 = (b + 1) + 40
我通常更喜欢std::copy
,因为它是通用的,可以与任何 iteratable 类型一起使用。
答案 1 :(得分:5)
你可以使用strcpy()
来移动参数:
strcpy(a,b + 1);
这将跳过b
的第一个字符。
答案 2 :(得分:1)
您可以从第二个字符开始复制源字符串:
char x[ 41 ];
char y[ 40 ];
/* ... */
strcpy( y, x + 1 );
答案 3 :(得分:1)
我不明白为什么你应该使用strcpy而不是memcpy。以下代码将对SSE2 / SSE3处理器有效,它将利用SIMD指令。
len=strlen(b)-1;
memcpy(a,b+1,len)
如果已知长度
memcpy(a,b+1,40)
如果您在阵列上操作
memcpy(a,b+1,sizeof(b)/sizeof(b[0])-1)
如果您想要更安全的方法:
#define min(a,b) ((a) < (b)?(a):(b))
......
memcpy(a,b+1,min(sizeof(b)/sizeof(b[0])-1,sizeof(a)/sizeof(a[0])))