En primer lugar, vamos a eliminar la conversión en desuso:
char const *charone = "I need the last four";
Las matrices no son valores de primera clase en C++, y que no son compatibles con el corte en lonchas. Sin embargo, al igual que el personaje anterior apunta al primer elemento de la matriz, puede señalar cualquier otro elemento. Los punteros se usan con caracteres para hacer cadenas de estilo C: el carácter apuntado hacia arriba hasta que un carácter nulo es el contenido de la cadena. Debido a que los caracteres que desea están en el extremo de la cadena actual (Charone), puede apuntar a la "f":
char const *chartwo = charone + 16;
O, para manejar los valores de cadena arbitrarias:
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;
O, porque estás usando 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".
En particular, cabe destacar que std :: string le da distintos valores, por lo que la modificación de alguna de las cadenas no modificar el otro como sucedería s con punteros.
¿Por qué echas? ¿Es porque estás usando gcc y te da una advertencia? –
Sí XP, y cuando no lo hago obtengo una falla de segmentación generalmente. – MetaDark
Derecha, en C++ los literales de cadena son const char, por lo que debe usar un const char * para señalarlo. Eso es probablemente lo que el compilador también le dice. –