2013-08-11 3 views
0

J'essaie d'améliorer les performances de mon lecteur de texte en clair en utilisant nmap pour mapper le fichier en mémoire. Actuellement, j'ai une fonction qui reçoit const char * et la longueur de ce tableau. Et j'ai besoin d'effectuer une recherche sur ce tableau char.comment exécuter std :: find sur const char *

C'est ce que je currenly ai

void parseVertex(
    const char * line, 
    unsigned int length, 
    std::vector<glm::vec3> & vertices) 
{ 
    if(length == 0) 
    { 
     return; 
    } 

    char space = ' '; 


    char * pos = std::find(line, line + length, space); 
} 

std::find produit erreur: une valeur de type * const char ne peut pas être utilisé pour initialiser une entité de type char *

Quelle est la bonne façon utiliser std::find?

+0

Eh bien, est-ce pas ** un peu ** suspect? Est-ce que vous vous souciez de l'exactitude de const? –

+0

Ce n'est pas réellement nessesery mais j'essaye d'apprendre comment protéger des variables de l'édition par accident, dans cette ligne de code ne devrait pas être changé ainsi il y a 'const' – insanebits

+3

vous êtes sur la bonne voie et vous devriez par tout signifie être en train de faire ça. C'est juste que vous devez garder à l'esprit que 'std :: find()' renvoie un pointeur à partir de la chaîne d'origine si trouvée (bien sûr), donc la chaîne d'origine était composée de 'const char's, la valeur de retour devrait aussi pointez sur 'const char', car si ce n'était pas le cas, il serait possible de modifier la chaîne via le pointeur retourné, et c'est une violation de contrainte. –

Répondre

7

std::find-type de retour dépend de ce que vous passez.

line est const char*, donc std::find retournera const char*, pas char*. Alors écrire ceci:

const char * pos = std::find(line, line + length, space); 

De même, si vous passez char*, vous obtiendrez char*.

Espérons que ça aide.

+1

Merci pour votre réponse. Toutes les réponses étaient correctes mais votre explication a été bien expliquée et je l'accepterai. – insanebits

4

Make it

const char* pos = std::find(...); 
1

Igor et Nawaz répondu à votre question, je vais juste ajouter que si votre compilateur permet C++11, vous prendriez une bonne habitude en utilisant std::begin et std::endpour les conteneurs de la bibliothèque standard et des tableaux (et non un pointeur comme celui-ci comme je l'ai écrit à l'origine).

const char line[] = "whatever accessible char array"; 
const char * pos = std::find(std::begin(line), std::end(line), space); 
+2

Bonne idée en général, mais pas dans ce cas: 'std :: begin' et' std :: end' ne fonctionneront pas avec un pointeur brut. Si vous aviez le tableau réel que le pointeur pointe vers ce serait bien. –

+0

@PeteBecker Oh ouais tu as tout à fait raison. –

3

vous travaillez sur const char* de sorte que vous ne pouvez pas lier le résultat à char*, il doit respecter le mot-clé const.

donc la bonne façon d'y parvenir est:

const char* pos = std::find(line, line + length, space); 
^
Questions connexes