2011-01-23 13 views
8

Siento que esta es una pregunta muy tonta, pero parece que no puedo encontrar una respuesta en ninguna parte.Obtenga parte de una matriz de caracteres

¿Es posible obtener un grupo de caracteres de una matriz de caracteres? para derribar algunos pseudo-código:

char arry[20] = "hello world!"; 
char part[10] = arry[0-4]; 
printf(part); 

de salida:

hello 

Por lo tanto, puedo obtener un segmento de caracteres de un conjunto como este sin bucle y conseguir que Char-por-char o la conversión a cadenas para que pueda usar substr()?

Respuesta

15

En resumen, no. Las "cuerdas" estilo C simplemente no funcionan de esa manera. Deberá utilizar un bucle manual o strncpy(), o hacerlo a través de la funcionalidad C++ std::string. ¡Dado que estás en C++, también puedes hacer todo con cadenas de C++!

nota lateral

Si llega el caso, para su aplicación ejemplo particular, se puede lograr esto simplemente a través de la funcionalidad ofrecida por printf():

printf("%.5s\n", arry); 
+0

Muy bien, eso está muy mal. Oh, bueno, puedo convertir a cadena, me preguntaba si había una solución más ... elegante. y estoy recortando una parte de la matriz de caracteres para usarla más adelante, así que solo usar las capacidades de printf no la resolverá. Pero gracias por ese tidbit de todos modos, no sabía nada de eso y podría ser útil. – Curlystraw

+0

@Curlystraw: la respuesta de @Mo-Juice a continuación usa cadenas de C++, y es muy elegante, ¡si me preguntas! –

14

Usted podría utilizar memcpy (o strncpy) para obtener una subcadena:

memcpy(part, arry + 5 /* Offset */, 3 /* Length */); 
part[3] = 0; /* Add terminator */ 

en otro aspecto de su código, tenga en cuenta que hacer printf(str) puede dar lugar a vulnerabilidades de cadenas de formato si str contiene una entrada que no es de confianza.

+0

+1 para vulnerabilidades 'printf'. –

4

Como dijo Oli, necesitaría usar la funcionalidad C++ std::string. En su ejemplo:

std::string hello("Hello World!"); 
std::string part(hello.substr(0, 5)); // note it's <start>, <length>, so not '0-4' 

std::cout << part; 
+6

Eso podría ser 'std :: string part (hello, 0, 5);' ... –

0

Bueno, menciona los dos enfoques obvios. Lo único que se me ocurre es definir tu propio tipo de subcadena para trabajar en las matrices de caracteres:

struct SubArray 
{ 
    SubArray(const char* a, unsigned s, unsigned e) 
     :arrayOwnedElseWhere_(a), 
     start_(s), 
     end_(e) 
    {} 
    const char* arrayOwnedElseWhere_; 
    unsigned start_; 
    unsigned end_; 
    void print() 
    { 
     printf_s("%.*s\n", end_ - start_ + 1, arrayOwnedElseWhere_ + start_); 
    } 
}; 
Cuestiones relacionadas