如何将char [41]转换为char [40]

时间:2011-12-02 06:01:52

标签: c++ arrays char

通常我会strcpy,但看起来我不能将较大尺寸复制到较小尺寸的数组。我知道我需要为它跳过一个数组元素,我想跳过第一个[0]元素,但我怎么能这样做呢?我真的不想写类似a[39]=b[40]; a[38]=b[39]...等的东西。

4 个答案:

答案 0 :(得分:11)

安全玩耍。使用strncpy代替strcpy

std::strncpy(a, b + 1, 40);

即使b中的最后一个字符不是'\0',或者索引'\0'处的某个地方有i,它也会有效。

如果strncpya不被视为 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])))