2010-08-01 1 views
1

Можно создать дубликат:
how to copy char * into a string and vice-versaC++ символ * в строке

Я должен передать значение в метод, который требуется полукокса *

MyMethod(char * parameter) 
{ 
    // code 
} 

Однако, параметр, который мне нужно передать, в настоящее время является std :: string. Как преобразовать std :: string в char *?

std::string myStringParameter = //whatever 

char * myCharParameter = //Convert here somehow 

MyMethod(myCharParameter); 
+0

дубликата [как скопировать символ * в строку и наоборот] (HTTP://stackoverflow.com/questions/2564052/how-to-copy-char-into-a-string-and-vice-versa). –

+1

Человек, почему я не могу найти эти вопросы, когда я ищу em :-( –

ответ

4

Вы ищете метод c_str():

char * myCharParameter = myStringParameter.c_str(); 

Вам может понадобиться const_cast возвращения, чтобы получить его в char * вместо const char *. Воздержитесь от изменения строки; это внутренний буфер объекта std::string. Если вы на самом деле нужно изменить строку, вы должны использовать strncpy, чтобы скопировать его в другой буфер:.

char * myCharParameter = new char[myStringParameter.length() + 1]; 
strncpy(myCharParameter, myStringParameter.c_str(), myStringParameter.length() + 1); 

// And later... 
myStringParameter.assign(myCharParameter); 
delete [] myCharParameter; 
+2

const char *, если быть точным. – seand

+0

'c_str()' возвращает 'const char *', а не 'char *'. –

+0

@James McNellis Уже обращался к этому вопросу. – jdmichal

1

Это зависит от того, на самом деле изменяет MyMethod строку, которая передается в

Если единственное, что вы знаете, это сигнатура, тогда вы должны предположить, что она может изменить строку и скопировать ее во временный буфер на ответ @ jdmichal.

Возможно также, что разработчик этого API не знал и не заботился о правильности const. Таким образом, функция принимает буфер не const, даже если он не меняет его.

Если это так, вы можете получить с:

MyMethod(const_cast<char*>(myStringParameter.c_str()); 

В моей карьере я встречал больше, чем потратить несколько API в не- const строк, которые должны были const.

0

Если функция действительно собирается изменить строку, вы бы лучше создать отдельную копию:

std::string str = // ... 
char* cstr = strdup(str.c_str()); 
MyMethod(cstr); 
// If you want to preserve the changes made: 
// str = cstr; 
free(cstr);