2013-03-13 8 views
0

В C++ У меня есть переменная строка массива называется:Как получить определенный элемент из массива std :: strings в качестве LPCSTR?

... 
/* set the variable */ 
string fileRows[500]; 
... 
/* fill the array with a file rows */ 
while (getline(infile,sIn)) 
{ 
    fileRows[i] = sIn; 
    i++; 
} 

и объект, который имеет это:

string Data::fileName(){ 
    return (fileRows); 
} 

Я хотел бы сделать функцию, которая возвращает массив, и после того, что я хотел бы назвать это что-то вроде этого:

Data name(hwnd); 
MessageBox(hwnd, name.fileName(), "About", MB_OK); 

Но я получаю эту ошибку:

cannot convert 'std::string* {aka std::basic_string}' to 'LPCSTR {aka const char}' for argument '2' to 'int MessageBoxA(HWND, LPCSTR, LPCSTR, UINT)'

Если я хотел бы показать элемент 5. массива, как его преобразовать?

+4

'MessageBox (. HWND, name.fileName() c_str(), "О", MB_OK);'? – Blake

+0

Что такое объявление для MessageBoxA? –

ответ

2

fileRows представляет собой массив из 500 элементов. Если вы хотите вернуть массив, чтобы позднее вы могли получить доступ к n-му элементу, вы должны вернуть указатель в начало массива.Например:

string* Data::fileName(){ 
     return fileRows; 
} 

Хотя это, вероятно, лучше использовать:

const string& Data::getFileName(size_t index){ 
     return fileRows[index]; 
} 

Используя первый метод, вы можете получить доступ к п-й элемент с помощью:

data.filename()[n]; 

Таким образом, если вы хотите получить доступ к 5-му элементу массива, который вы должны использовать:

data.filename()[4]; 

С другой стороны, функция MessageBox нуждается в const char *. Таким образом, вы должны вызвать метод c_str(), чтобы получить указатель:

Data name(hwnd); 
MessageBox(hwnd, name.fileName()[4].c_str(), "About", MB_OK); 
+0

Спасибо большое, что было проблемой! :-) Спасибо! – David

+0

-1 'fileName [5]' не является пятым элементом. – LihO

+0

@LihO Вы правы, но я этого не говорил. Во всяком случае, я уточню ответ, чтобы уточнить. –

5

LPCSTR - это не что иное, как псевдоним для const char*. Проблема в том, что Data::fileName() возвращает объект std::string и нет никакого неявного преобразования в const char*.

Чтобы получить строку из std::string в виде const char* используйте c_str() метод,:

MessageBox(hwnd, name.fileName().c_str(), "About", MB_OK); 

Также обратите внимание, что вы создали массив из std::string объектов:

string fileRows[500]; 

но в Data::fileName() вы пытаетесь вернуть его как один объект std::string:

string Data::fileName() { 
    return fileRows; 
} 

Я рекомендую использовать std::vector вместо массива C-стиля.

If i would like to show the 5. element of the array, how to convert it?

Независимо от того, будете ли вы использовать std::vector или продолжать использовать массив, он будет выглядеть следующим образом: функция

std::string Data::fileName() { 
    return fileRows[4]; 
} 
+2

'LPCSTR' является' char const * '. : -] – ildjarn

+0

У меня получилась ошибка: error: could not convert '(std :: string *) (& (Data *) this) -> Data :: fileRows)' from 'std :: string * {aka std :: basic_string *} 'to' std :: string {aka std :: basic_string } ' – David

+0

@ildjarn: Действительно;) – LihO

0

использование std:string «ы c_str() ... посмотрите на эту answer

1

std::string::c_str даст вам указатель на массив, содержащий последовательность символов с нулевым завершением (например, C-строку) или LPCSTR

 Смежные вопросы

  • Нет связанных вопросов^_^