0 votes

string vers const char*

Cette ligne :

strcat(query,*it);

(où *it est un itérateur vers une chaîne de caractères)

Ça ne cesse de me donner cette erreur :

pas de fonction correspondante pour l'appel à \N `strcat(char[200], const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&) '

Je suppose que c'est parce que strcat accueille un char* tandis que *it est une chaîne de caractères. Comment puis-je le convertir d'une chaîne de caractères en un mot de passe ? char* pour le faire fonctionner avec strcat() ?

J'ai essayé strcat(query,(*it).c_str()) mais cela me donne juste une erreur d'exécution.

Edit : sorry, it should be converted to a const char*

1voto

Michael Burr Points 181287

Puisque vous avez exclu que query n'est pas à terminaison nulle, il semble que le consensus soit que le problème est probablement l'un des suivants :

  1. dépassement de tampon - le tampon pointé par query est pas assez grande pour avoir (*it).c_str() concaténée à celle-ci
  2. l'itérateur, it n'est pas valide. Cela peut se produire de plusieurs façons, notamment :

    • n'est pas correctement initialisé ;
    • a la valeur de someContainer.end() ;
    • ou le conteneur a été modifié d'une manière qui invalide un itérateur existant.

Vous devriez être capable de déterminer ce qui se passe avec un débogueur. Aussi, je suis sûr que si vous postez plus de code, qui montre comment query y it sont définis et utilisés, vous obtiendrez une réponse définitive ici aussi (ce qui constitue un débogage à distance).

0voto

Stefan Rådström Points 645

Essayez ceci (je suppose que l'erreur d'exécution est due à un pointeur NULL/invalide) :

for (...; it != str.end(); ++it)
...
   if (!it->empty())
   {
      strcat(query, it->c_str());
   }

EDIT : Désolé, c_str() ne retourne jamais NULL, ce que j'ai temporairement oublié, donc il est toujours sûr. A moins que le tampon de requête ne soit pas assez long pour pouvoir contenir toutes les chaînes concaténées bien sûr (ou qu'il y ait un autre problème, comme un itérateur au-delà de .end(), le conteneur modifié pendant la boucle, ou quelque chose de similaire).

0voto

Arkadiy Points 10567

Est-ce que *il pointe vers une chaîne de caractères valide dans tous les cas ? Pourrait-il pointer sur end() lors de la dernière itération ? Ou peut-être que le conteneur dans lequel il pointe a été modifié, invalidant *it.

0voto

Vinay Points 3310

Si l'application est en mode release, tracez l'application en mettant les boîtes de messages ou en générant l'interruption 3. (_asm int 3 ;) à des endroits particuliers. Et si vous avez placé l'interruption, l'exe affichera un message de débogage. Attachez le processus à Visual Studio pour le déboguer. Espérons que de cette façon nous pourrons connaître l'endroit du crash.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X