2012-05-12 12 views
14

Per esempio, supponiamo di avere std::string contenente percorso in stile UNIX a qualche file:efficiente modo per troncare stringa di lunghezza N

string path("/first/second/blah/myfile"); 

Supponiamo ora voglio buttare via le informazioni relative ai file e ottenere il percorso a ' bla 'cartella da questa stringa. Quindi c'è un modo efficiente (dicendo 'efficiente' intendo 'senza alcuna copia') di troncare questa stringa in modo che contenga solo "/first/second/blah"?

Grazie in anticipo.

risposta

30

Se N è noto, è possibile utilizzare

path.erase(N, std::string::npos); 

Se N non è noto e si vuole trovare, è possibile utilizzare una qualsiasi delle funzioni di ricerca. In questo caso si 'll desidera trovare l'ultima barra, in modo da poter utilizzare rfind o find_last_of:

path.erase(path.rfind('/'), std::string::npos); 
path.erase(path.find_last_of('/'), std::string::npos); 

C'è anche una variante di questo sulla base di iteratori:

path.erase (path.begin() + path.rfind('/'), path.end()); 

Detto questo, se si stanno andando a manipolare percorsi per vivere è meglio usare una libreria progettata per questo compito, come ad esempio Boost Filesystem.

+0

Esattamente quello che volevo! Sapevo che ci doveva essere il modo _beautiful_ di farlo :) Grazie. – tonytony

+0

Oppure molti modi stupendi :) – chris

+0

Ho modificato la risposta, std :: string :: npos al posto di std :: npos. npos è un membro di std :: string not std –

Problemi correlati