2013-03-13 1 views
0

En C++, J'ai une variable de tableau de chaîne appelée:Comment récupérer l'élément spécifique d'un tableau de chaînes std :: en tant que LPCSTR?

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

et un objet qui a ceci:

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

Je voudrais faire une fonction qui renvoie un tableau, et après que je voudrais appeler quelque chose comme ceci:

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

Mais je reçois cette erreur:

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

Si je voudrais montrer l'élément 5. du tableau, comment le convertir?

+4

'MessageBox (. Hwnd, name.fileName() c_str(), "A propos", MB_OK);'? – Blake

+0

Quelle est la déclaration pour MessageBoxA? –

Répondre

2

fileRows est un tableau de 500 éléments. Si vous voulez retourner le tableau pour pouvoir accéder ultérieurement au n-ième élément, vous devez renvoyer le pointeur au début du tableau.Par exemple:

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

Bien qu'il est probablement préférable d'utiliser:

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

En utilisant la première méthode, vous pouvez accéder à l'élément n-ième en utilisant:

data.filename()[n]; 

Donc, si vous voulez accéder au 5ème élément du tableau que vous devez utiliser:

data.filename()[4]; 

D'autre part, la fonction MessageBox a besoin d'un const char *. Donc, vous devez appeler la méthode c_str() pour obtenir le pointeur:

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

Merci beaucoup c'était le problème! :-) Merci! – David

+0

-1 'nomFichier [5]' n'est pas le 5ème élément. – LihO

+0

@LihO Vous avez raison, mais je n'ai pas dit que c'était. Quoi qu'il en soit, je vais mettre à jour la réponse pour clarifier. –

5

LPCSTR n'est rien d'autre qu'un alias pour const char*. Le problème est que le Data::fileName() renvoie un objet std::string et qu'il n'y a pas de conversion implicite en const char*.

Pour récupérer une chaîne à partir de la méthode std::string sous forme de const char*, utilisez c_str(),:

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

Notez également que vous avez créé un tableau de std::string objets:

string fileRows[500]; 

mais dans le Data::fileName() vous essayez de le retourner comme un seul std::string objet:

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

je vous recommande d'utiliser std::vector à la place d'un tableau de style C bien.

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

Peu importe si vous allez utiliser std::vector ou continuer à utiliser un tableau, il ressemblera à ceci:

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

'LPCSTR' est' char const * '. : -] – ildjarn

+0

J'ai eu cette erreur: erreur: impossible de convertir '(std :: string *) (& ((Data *) this) -> Données :: fileRows)' from 'std :: string * {aka std :: basic_string *} 'to' std :: chaîne {aka std :: chaîne_base } ' – David

+0

@ildjarn: Indeed;) – LihO

0

utiliser la fonction d » std:string de c_str() ... jetez un oeil à ce answer

1

std::string::c_str vous donnera un pointeur vers un tableau qui contient une séquence de caractères terminée par zéro (c'est-à-dire, une chaîne de caractères) ou LPCSTR

Questions connexes