2011-01-23 14 views
8

Mi sembra una domanda davvero sciocca, ma non riesco a trovare una risposta da nessuna parte!Ottieni parte di un array di caratteri

È possibile ottenere un gruppo di caratteri da un array di caratteri? a buttare giù qualche pseudo-codice:

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

uscita:

hello 

Quindi, posso avere un segmento di caratteri da una matrice come questo senza loop e inducendole char-by-char o la conversione alle stringhe quindi posso usare substr()?

risposta

15

In breve, no. Le "stringhe" in stile C semplicemente non funzionano in questo modo. Dovrai utilizzare un ciclo manuale, o strncpy(), o farlo tramite la funzionalità C++ std::string. Dato che sei in C++, puoi anche fare tutto con le stringhe C++!

Side-note

Come accade, per una particolare applicazione di esempio, è possibile ottenere questo semplicemente tramite la funzionalità offerta da printf():

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

Va bene, è troppo male. Oh bene, posso convertire in stringa, stavo solo chiedendo se ci fosse una soluzione più ... elegante. e sto tagliando una parte del char array da usare in seguito, quindi basta usare le abilità di printf per non risolverlo. Ma grazie comunque per quello, non lo sapevo e potrebbe tornare utile! – Curlystraw

+0

@Curlystraw: @ La risposta di Moo-Juice qui sotto utilizza le stringhe C++ ed è dannatamente elegante, se me lo chiedi! –

14

Si potrebbe utilizzare memcpy (o strncpy) per ottenere una sottostringa:

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

Su un altro aspetto del tuo codice, nota che fare printf(str) può portare a formattare vulnerabilità delle stringhe se str contiene input non fidati.

+0

+1 per le vulnerabilità 'printf'. –

4

Come detto Oli, è necessario utilizzare la funzionalità C++ std::string. Nel tuo esempio:

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

Potrebbe essere 'std :: string part (ciao, 0, 5);' ... –

0

Bene, si menzionano i due approcci ovvi. L'unica cosa che posso pensare sarebbe definire il tuo tipo di sottostringa per risolvere array di caratteri:

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_); 
    } 
}; 
Problemi correlati