2010-04-25 18 views

risposta

20
  1. Per ottenere l'equivalente C stringa l'C++string oggetto uso funzione c_str .
  2. Per individuare la prima occorrenza di un char in un oggetto string uso funzione find_first_of.

Esempio:

string s = "abc"; 

// call to strlen expects char * 
cout<<strlen(s.c_str()); // prints 3 

// on failure find_first_of return string::npos 
if(s.find_first_of('a') != string::npos) 
    cout<<s<<" has an a"<<endl; 
else 
    cout<<s<<" has no a"<<endl; 

Nota: ho dato il strlen solo un esempio di una funzione che prende char*.

+0

@unicornaddict: grazie. ora come faccio a trovare le altre occorrenze di quel personaggio nella stringa? [la lunghezza della stringa è enorme, quindi creare una stringa completamente nuova non è un'opzione] – Moeb

+1

@cambr: esiste una ** versione ** sovraccaricata di 'find_first_of' che accetta la ** posizione per avviare la ricerca da ** come argomento. Ho pubblicato un esempio qui: http://www.ideone.com/bESwL – codaddict

0

Se str nella stringa utilizzare il metodo str.c_str() per ottenere il carattere * al suo interno.

+3

Sei sicuro che sia 'c_tsr' e non' c_str'? Non sono un esperto in C++ ma ho cercato su Google per 'c_tsr' ed è stato corretto su' c_str'. –

+0

mio cattivo - Riparerò che –

6

Sorprendentemente, std:; la stringa ha molte più possibilità rispetto alle stringhe in stile C. Probabilmente vuoi il metodo find_first_of(). In generale, se ti trovi a utilizzare le funzioni strxxx() su C++ std :: stringhe, stai quasi certamente facendo qualcosa di sbagliato.

Come gran parte della libreria standard C++, la classe stringa è una bestia complessa. Per sfruttarlo al meglio, hai davvero bisogno di un buon libro di consultazione. Raccomando The C++ Standard Library, di Nicolai Josuttis.

0

Se si desidera solo per assegnare una stringa letterale per pw, si può fare come

char *pw = "Hello world"; 

Se si dispone di un oggetto C++ std :: string, il cui valore si desidera assegnare al pw, si può fare come

char *pw = some_string.c_str()

Tuttavia, il valore che pw punti saranno validi solo per il tempo di vita di some_string.

Maggiori informazioni qui:
How to assign a string to char *pw in c++

Goodluck !!

+1

Sbagliato. c_str() restituisce un const char * –

+0

Questa non è una buona idea. Non c'è alcuna garanzia che pw indicherà gli stessi dati in un secondo momento, anche se some_string è ancora in circolazione. È molto più sicuro chiamare c_str() a ciascuna funzione necessaria per passare un char *. –

4

Non è possibile ottenere un char* da un string

string non ti permettere l'accesso gratuito al suo buffer interno. Il più vicino possibile è uno const char* utilizzando .c_str() se lo si desidera terminato con null o .data() se non deve essere terminato con null.

è quindi possibile lanciare il puntatore restituito da queste funzioni per char* ma farlo a proprio rischio. Detto questo, si tratta di un cast relativamente sicuro da fare fintanto che ci si assicura che non si stia cambiando la stringa. Se lo hai cambiato, il puntatore che hai ottenuto da c_str() potrebbe non essere più valido.

Questo codice:

string str("Hello World!"); 
char* sp = (char*)str.c_str(); 
sp[5] = 'K'; 

è probabilmente ok
Tuttavia questo:

string str("Hello World!"); 
char* sp = (char*)str.c_str(); 
str = "Chaged string"; 
sp[5] = 'K'; 

è sicuramente non ok.

+2

Non è ben definito. –

+0

+1 perché questa è la risposta alla domanda _I_ cercavo :) –

+0

Ulteriori discussioni qui: http://bytes.com/topic/c/answers/544209-std-string-c_str-const_cast-char –

0
std::string yourString("just an example"); 
char* charPtr = new char[yourString.size()+1]; 
strcpy(charPtr, yourString.c_str()); 
+0

Copia via un puntatore non inizializzato raramente è una buona idea. –

+0

@Neil: è un esempio, jeez ... ma l'ho modificato per il tuo piacere ;-) – JRL

+0

Puoi evitare la gestione manuale della memoria facendo 'std :: vector charBuf (yourString.begin(), yourString.end()); charBuf.push_back ('\ 0'); '- questo ti permetterà di usare' & charBuf [0] 'per ottenere un' char * '. –

0

Forse questo exmaple vi aiuterà a

#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    string str ("Replace the vowels in this sentence by asterisks."); 
    size_t found; 

    found=str.find_first_of("aeiou"); 
    while (found!=string::npos) 
    { 
    str[found]='*'; 
    found=str.find_first_of("aeiou",found+1); 
    } 

    cout << str << endl; 

    return 0; 
} 
0

standard C++ fornisce due funzioni membro della Claass std :: basic_string che restituiscono puntatore al primo elemento della stringa. Sono c_str() e data(). Ma entrambi restituiscono const char *, quindi non puoi usarli con una funzione che ha parametro di tipo char *.

Quanto funzione strchr quindi il primo parametro è const char *. Quindi puoi usare c_str() e data() con questa funzione. Tuttavia è molto meglio usare la funzione membro find() della classe sttd :: basic_string invece di strchr.

Problemi correlati