2010-04-25 9 views

Antwort

20
  1. Um die C entsprechende Zeichenfolge der C++string Objekt Verwendung c_str Funktion zu erhalten.
  2. Um das erste Auftreten eines char in einem Objekt string Verwendung find_first_of Funktion zu lokalisieren.

Beispiel:

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; 

Anmerkung: Ich habe das strlen nur ein Beispiel für eine Funktion, die char* nimmt.

+0

@unicornaddict: danke. Wie finde ich nun die anderen Vorkommen dieses Zeichens in der Zeichenkette? [Die Länge des Strings ist riesig, daher ist das Erstellen eines ganz neuen Strings keine Option] – Moeb

+1

@cambr: Es gibt eine ** überladene ** Version von 'find_first_of', die die ** Position akzeptiert, um die Suche von ** zu starten. als ein Argument. Ich habe hier ein Beispiel gepostet: http://www.ideone.com/bESwL – codaddict

0

Wenn str in Ihrer Zeichenfolge verwenden Sie str.c_str() Methode, um das Zeichen * in ihm zu erhalten.

+3

zu verwenden Sind Sie sicher, dass es 'c_tsr' und nicht' c_str' ist? Ich bin kein C++ Experte, aber ich googelte für 'c_tsr' und wurde zu' c_str' korrigiert. –

+0

mein schlechtes - ich werde das beheben –

6

Überraschenderweise hat std:; string weit mehr Möglichkeiten als C-style Strings. Sie möchten wahrscheinlich die find_first_of() Methode. Wenn Sie die strxxx() - Funktionen in C++ - std :: strings verwenden, tun Sie mit ziemlicher Sicherheit etwas falsch.

Wie viele der C++ - Standardbibliothek ist die String-Klasse ein komplexes Biest. Um das Beste daraus zu machen, brauchen Sie wirklich ein gutes Nachschlagewerk. Ich empfehle The C++ Standard Library, von Nicolai Josuttis.

0

Wenn Sie nur ein Stringliteral zu pw zuweisen möchten, können Sie es wie

char *pw = "Hello world"; 

tun können, wenn Sie eine C++ std :: string Objekt haben, deren Wert möchten Sie zuweisen pw, können Sie es wie

char *pw = some_string.c_str()

tun den Wert jedoch, dass pw Punkte nur für die Lebensdauer von some_string gültig sein wird.

Mehr hier:
How to assign a string to char *pw in c++

Goodluck !!

+1

Falsch. c_str() gibt ein const char * zurück –

+0

Das ist keine sehr gute Idee. Es gibt keine Garantie dafür, dass pw zu einem späteren Zeitpunkt auf die gleichen Daten zeigt, auch wenn noch einige Zeichen vorhanden sind. Es ist viel sicherer, c_str() für jede Funktion aufzurufen, die Sie benötigen, um ein Zeichen * zu übergeben. –

4

können Sie keine char* von einem string

string nicht erhalten Sie freien Zugang zu seinen internen Puffer nicht zulassen. Der nächste, den Sie erhalten können, ist ein const char* mit .c_str(), wenn Sie wollen, dass es null terminiert oder .data(), wenn es nicht null terminiert sein muss.

Sie können dann den von diesen Funktionen zurückgegebenen Zeiger auf char* umwandeln, aber Sie tun dies auf eigene Gefahr. Abgesehen davon ist dies eine relativ sichere Besetzung, solange Sie sicherstellen, dass Sie die Saite nicht ändern. Wenn Sie es geändert haben, ist der Zeiger, den Sie von c_str() erhalten haben, möglicherweise nicht mehr gültig.

Dieser Code:

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

ist wahrscheinlich ok
aber dies:

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

ist definitiv nicht in Ordnung.

+2

Es ist nicht gut definiert. –

+0

+1 für das ist die Antwort auf die Frage _I_ suchte nach :) –

+0

Weitere Diskussion hier: 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

Kopieren über Ein nicht initialisierter Zeiger ist selten eine gute Idee. –

+0

@Neil: es ist ein Beispiel, jeez ... aber ich habe es für Ihr Vergnügen bearbeitet ;-) – JRL

+0

Sie können manuelle Speicherverwaltung vermeiden, indem Sie 'std :: vector charBuf (yourString.begin(), yourString.end()); charBuf.push_back ('\ 0'); '- damit können Sie' & charBuf [0] 'verwenden, um ein' char * 'zu erhalten. –

0

Vielleicht exmaple werden Sie

#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

dem C++ Standard bietet zwei Elementfunktionen Claass std :: helfen basic_string, die Zeiger auf das erste Element des Strings zurück. Sie sind c_str() und data(). Aber die beiden geben const char * zurück, also darf man sie nicht mit einer Funktion verwenden, die Parameter vom Typ char * hat.

Wie für die Funktion strchr ist der erste Parameter const char *. Sie können also c_str() und data() mit dieser Funktion verwenden. Es ist jedoch viel besser, die Member-Funktion find() der Klasse sttd :: basic_string anstelle von strchr.