Question

Je vais avoir du mal à utiliser std :: string :: itérateurs en C ++. Ce code compile bien (toujours pas obtenir une sortie correcte, mais c'est ma faute: TODO, fix algorithme) dans Dev-C ++, et je ne reçois pas d'erreurs d'exécution. L'erreur est avec Visual Studio Express 2008 C ++, où je reçois une erreur de pointage à : "Expression: iterator chaîne ne dereferencable". Et les points à la ligne 112 du fichier

Mon débogage me dit que je pourrais essayer de déréférencer après la fin de l'entrée de la phrase, mais je ne vois pas où. Quelqu'un peut-il faire la lumière?

std::string wordWrap(std::string sentence, int width)
{    
    std::string::iterator it = sentence.begin();

    //remember how long next word is
    int nextWordLength = 0;
    int distanceFromWidth = width;

    while (it < sentence.end())
    {
       while (*it != ' ' && it != sentence.end())
       {
          nextWordLength++;
          distanceFromWidth--;
          it++;
       }

       if (nextWordLength > distanceFromWidth)
       {
          *it = '\n';
          distanceFromWidth = width;
          nextWordLength = 0;
       }

       //skip the space
       it++;

   }

   return sentence;    
}
Était-ce utile?

La solution

!

Tout d'abord, l'opérateur d'utilisation = () sur itérateurs, non opérateur <():

while (it != sentence.end())

, ceci est en arrière En second lieu: while (*it != ' ' && it != sentence.end())

Vous faites quelque chose avec le iterator, que vérifier si l'itérateur est valide. Au contraire, vous devriez vérifier si elle est valide d'abord:

while (it != sentence.end() && *it != ' ')

Troisièmement, vous devez utiliser ++ itérateur sur iterator ++, bien que cela ne soit pas lié à votre plantage.


Quatrièmement, une question principale est ici:

*it = '\n';

En raison du contrôle précédent, while (it != sentence.end(), il est possible d'atteindre ce iterator déréférencer tout en étant à la fin. Un correctif serait de faire ceci:

if (it != sentence.end() && nextWordLength > distanceFromWidth)

Alors maintenant, si vous avez atteint la fin, vous vous arrêtez.


Après avoir résolu la question précédente, maintenant le seul problème est le suivant:

//skip the space
++it;

Cela suppose que le personnage que vous sautez est en fait un espace. Mais qu'en est-la fin de la chaîne? Exécutez cette fonction avec cette chaîne:

"a test string " // <- space at end

Et il réussira; il saute l'espace, en mettant l'itérateur à end(), les sorties de la boucle et le succès.

Cependant, sans l'espace, il se bloque, parce que vous avez atteint la fin, et que sauter après la fin. Pour corriger, ajouter un chèque:

//skip the space
if (it != sentence.end())
{
    ++it;
}

Résultant dans ce code final:

std::string wordWrap(std::string sentence, int width)
{    
    std::string::iterator it = sentence.begin();

    //remember how long next word is
    int nextWordLength = 0;
    int distanceFromWidth = width;

    while (it != sentence.end())
    {
        while (it != sentence.end() && *it != ' ')
        {
            nextWordLength++;
            distanceFromWidth--;
            ++it;
        }

        if (it != sentence.end() && nextWordLength > distanceFromWidth)
        {
            *it = '\n';
            distanceFromWidth = width;
            nextWordLength = 0;
        }

        //skip the space
        if (it != sentence.end())
        {
            ++it;
        }

    }

    return sentence;    
}

Vous remarquerez peut-être cela semble qu'il a beaucoup de contrôles redondants. Cela peut être corrigé:

std::string wordWrap(std::string sentence, int width)
{    
    std::string::iterator it = sentence.begin();

    //remember how long next word is
    int nextWordLength = 0;
    int distanceFromWidth = width;

    while (it != sentence.end())
    {
        while (*it != ' ')
        {
            nextWordLength++;
            distanceFromWidth--;

            ++it;

            // check if done
            if (it == sentence.end())
            {
                return sentence;
            }
        }

        if (nextWordLength > distanceFromWidth)
        {
            *it = '\n';
            distanceFromWidth = width;
            nextWordLength = 0;
        }

        //skip the space
        ++it;
    }

    return sentence;    
}

Si tout va bien qui aide!

Autres conseils

while (*it != ' ' && it != sentence.end())

modifications à

while (it != sentence.end() && *it != ' ')

la deuxième expression est pas évalué si la première si elle est fausse.

   if (nextWordLength > distanceFromWidth)

devrait probablement changer à

   if (it == sentence.end())
         break;
   if (nextWordLength > distanceFromWidth)

Presque certainement votre erreur est le résultat de:

*it = '\n';

Depuis la précédente while un de vos conditions d'arrêt est:

it != sentence.end()

Si elle == sentence.end (), puis * it = '\ n' ne volera pas

Il y a plus d'erreurs, mais c'est celui qui est à l'origine de votre problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top