2010-07-08 2 views
2

Мы имеем:Каков наиболее эффективный способ преобразования строкового массива STL в массив const char *?

std::string string_array[2]; 

string_array[0] = "some data"; 

string_array[1] = "some more data"; 

char* cstring_array[2]; 

Что является наиболее эффективным способом, чтобы скопировать данные из string_array в cstring_array? Или передать string_array в функцию, необходимо «const char* cstring_array[]»?

+7

Индексы 0 основаны на C++. Итак, вы имеете в виду 'string_array [0]' и 'string_array [1]' –

+0

Да, конечно, спасибо – hoxnox

+0

Как функция использует const char * cstring_array []? –

ответ

12

Функция, которая принимает char const *, записывается только для принятия одной строки за раз, а не из массива строк. Чтобы передать такую ​​функцию std::string, просто вызовите функцию с параметром your_string.c_str().

Edit: для функции, которая принимает массив строк, очевидный выбор (по крайней мере для меня) было бы написать минимальный передний конец, который позволяет передавать vector<std::string>:

// The pre-existing function we want to call. 
void func(char const *strings[], size_t num) { 
    for (size_t i=0;i<num; i++) 
     std::cout << strings[i] << "\n"; 
} 

// our overload that takes a vector<string>: 
void func(std::vector<std::string> const &strings) { 
    std::vector<char const *> proxies(strings.size()); 

    for (int i=0; i<proxies.size(); i++) 
     proxies[i] = strings[i].c_str(); 
    func(&proxies[0], proxies.size()); 
} 
+0

Извините, я допустил ошибку. Функция требует const char * array []. ARRAY строк const char *. – hoxnox

+0

Awesome !!! Благодаря!!! – hoxnox

3

Просто используйте:
string_array[0].c_str()
string_array[1].c_str()

См c_str():

Const ДИАГРАММА * c_str() Const basic_string Возвращает указатель на нуль-терминатором массив символов, представляющих string's содержание.

+0

Извините, я допустил ошибку. Функция требует const char * array []. ARRAY строк const char *. – hoxnox

4

Используйте string::c_str, чтобы получить указатель const на символ.

+0

Извините, я допустил ошибку. Функция требует const char * array []. ARRAY строк const char *. – hoxnox

1

Вы можете получить доступ к версии c-строки, передав string_array [1] .c_str() для любой функции, требующей строку.

Помните, что возвращенный указатель зависит от stl :: string! Если вы возьмете указатель, а затем освободите строку, у вас будет указатель недействительный

+0

Или даже если вы измените строку, не освободив ее. Буфер можно было освободить и заменить на более крупный. –

+0

Извините, я допустил ошибку. Функция требует const char * array []. ARRAY строк const char *. – hoxnox

0

Два разных вопроса, действительно. Чтобы перейти к функции, просто вызовите c_str(). Для копирования просто позвоните strncpy() и вспомните, что я сказал о переходе к функциям.

Имейте в виду, что std :: string может содержать '\ 0' без фактического завершения. В таких условиях вы получите только часть строки. Если вы пытаетесь скопировать такие данные, вам нужно будет использовать memcpy().

+0

Извините, я допустил ошибку. Функция требует const char * array []. ARRAY строк const char *. – hoxnox

+0

Затем вам потребуется скопировать их, индивидуально, в массив. Нет никакого набора функций, которые могли бы временно перенести одно в другое. –

+0

Может быть, есть способ получить доступ к памяти, выделенной в STL-строке? И некоторая «магия» делает эту память похожей на массив const char *? Я дерамер =)) – hoxnox

0

Похоже, у вас проблемы с массивами. Как отметил Брайан, индексы массива начинаются с 0, а не 1. Таким образом, ваши два strings: string_array[0] и string_array[1], неstring_array[1] и string_array[2].

Кроме того, если ваша функция принимает параметр const char* cstring_array, то ваша переменная char* cstring_array[2], вероятно, не то, что вы хотите. Если бы вы передали его как есть, вы по существу проходили бы в char**, а не char*, так как вы можете считать имя массива эквивалентным указателю на его первый элемент.

Как вы представили свой вопрос, вы могли сделать что-то вроде следующего (исправление для ошибки индексации, и предполагая функцию, которую вы упомянули, называется myFunction):

... 
cstring_array[0] = string_array[0].c_str(); 
cstring_array[1] = string_array[1].c_str(); 

myFunction (cstring_array[0]); 
myFunction (cstring_array[1]); 
... 

Однако проще эквивалент, который не требует cstring_array на все:

... 
myFunction (string_array[0].c_str()); 
myFunction (string_array[1].c_str()); 
... 

Или, если ваше намерение было пройти один char массив, содержащий личинку ч строк (что возможность из моей интерпретации вопроса), то, что вы на самом деле означает, что вы хотите сделать, это вы хотите, чтобы произвести одну строку, будучи конкатенация оригинального двух:

... 
std::string str = string_array[0] + string_array[1]; 

myFunction (str.c_str()); 
... 

Надежда, что помогает !

EDIT: учитывая комментарии, появившиеся с тех пор, как я написал это, я бы сказал, что первый пример близок к тому, что вам нужно. Я бы сделал следующее (где N - количество записей в любом массиве):

... 
for (int i = 0; i < N; i++) 
    cstring_array[i] = string_array[i].c_str(); 

myFunction (cstring_array); 
... 

Это единственный возможный подход. Нет стандартной функции (AFAIK), которая, учитывая массив string, даст массив char*. Я подозреваю, что причины таковы: - Это не то, что нужно делать часто, поэтому мало нужно, чтобы такая функция была широко доступна. - Если бы была такая функция, она, скорее всего, была бы очень похожа на вышесказанное в любом случае, и в этом случае это настолько тривиально, что не нужно.

В принципе, чтобы ответить на ваш вопрос, я не думаю, что есть более эффективный метод, и даже если бы была стандартная функция библиотеки для этого, он все равно использовал бы этот подход.

+0

> for (int i = 0; i cstring_array [i] = string_array [i] .c_str(); Но в этом случае я должен выделить память для cstring_array. Может быть, есть лучший способ? Получите доступ к памяти, выделенной строковым массивом STL, или smth ...? – hoxnox