用c ++进行数组切片

时间:2011-02-19 02:04:25

标签: c++

我正在尝试将字符数组中的最后4个字符切片,我尝试了python使用的方法但没有成功;

char *charone = (char*)("I need the last four")
char *chartwo = charone[-4:]

cout << chartwo << endl;

我希望此代码返回;

four

但是c / c ++似乎并不那么容易......

我在哪里可以找到一个简单的替代方法,将一个char数组的最后4个字符返回到另一个char数组中?

6 个答案:

答案 0 :(得分:13)

尝试:

int len = strlen(charone);
char *chartwo = charone + (len < 4 ? 0 : len - 4);

在C ++中,您可以将其替换为:

char* chartwo = charone + (std::max)(strlen(charone), 4) - 4;

代码使用C字符串的特殊属性,仅用于切断字符串的开头。

答案 1 :(得分:7)

首先,我们删除已弃用的转化:

char const *charone = "I need the last four";

数组不是C ++中的第一类值,它们不支持切片。但是,正如上面的charone指向数组中的第一个项目一样,您可以指向任何其他项目。指针与字符一起用于制作C风格的字符串:指向字符串,直到空字符串为字符串的内容。因为您想要的字符位于当前(字符串)字符串的末尾,您可以指向“f”:

char const *chartwo = charone + 16;

或者,处理任意字符串值:

char const *charone = "from this arbitrary string value, I need the last four";
int charone_len = strlen(charone);
assert(charone_len >= 4);  // Or other error-checking.
char const *chartwo = charone + charone_len - 4;

或者,因为你正在使用C ++:

std::string one = "from this arbitrary string value, I need the last four";
assert(one.size() >= 4);  // Or other error-checking, since one.size() - 4
// might underflow (size_type is unsigned).
std::string two = one.substr(one.size() - 4);

// To mimic Python's [-4:] meaning "up to the last four":
std::string three = one.substr(one.size() < 4 ? 0 : one.size() - 4);
// E.g. if one == "ab", then three == "ab".

特别要注意,std :: string为你提供了不同的值,因此修改任何一个字符串都不会像指针那样修改另一个字符串。

答案 2 :(得分:5)

C ++和Python非常不同。 C ++没有内置的类似Python的字符串工具,但它的Standard Template Library有一个方便的std::string类型,您应该查看它。

答案 3 :(得分:3)

如果您想短暂访问最后四个字符,那么

char* chartwo = charone + (strlen(charone) - 4);

会很好(加上一些错误检查)。

但是如果你想复制python功能,你需要复制最后四个字符。再次,使用strlen获取长度(或预先将其存储在某处),然后使用strcpy(或者可能是具有相同功能的更好的stl函数)。类似......

char chartwo[5];
strcpy(chartwo, charone + strlen(charone) - 4);

(注意:如果你不复制,那么在你完成使用chartwo之前就不能释放charone。另外,如果你不复制,那么如果你以后更改了charone,mapwo也会改变。那没关系,那么确定,只需指向偏移量。)

答案 4 :(得分:1)

这样做:

char* chartwo = charone + 16;

答案 5 :(得分:1)

c ++中的数组切片:

array<char, 13> msg  = {"Hello world!"};
array<char, 6>  part = {"world"};

// this line generates no instructions and does not copy data
// It just tells the compiler how to interpret the bits
array<char, 5>& myslice = *reinterpret_cast<array<char,5>*>(&msg[6]); 

// now they are the same length and we can compare them
if( myslice == part )
   cout<< "huzzah";

这只是切片很有用的例子之一

我创建了一个小型库,可以在https://github.com/Erikvv/array-slicing-cpp

进行编译时边界检查