В C ++ я получаю ошибку компилятора, которую не могу понять - PullRequest
0 голосов
/ 14 июля 2020

Вот мой код, он просто меняет предложение:

#include <iostream>
#include <string>   

using namespace std;

int main()
{
    string sentence;
    string reversedSentence;
    int i2 = 0;

    cout << "Type in a sentence..." << endl;
    getline(cin, sentence);

    for (int i = sentence.length() - 1; i < sentence.length(); i--)
    {
        reversedSentence[i2] = sentence[i];
        i2++;
    }

    cout << reversedSentence << endl;
}

Компиляция работает нормально, но когда я пытаюсь запустить программу, происходит следующее:

Type in a sentence...
[input]
/home/keith/builds/mingw/gcc-9.2.0-mingw32-cross-native/mingw32/libstdc++-v3/include/bits/basic_string.h:1067: std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::reference std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator[](std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::reference = char&; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = unsigned int]: Assertion '__pos <= size()' failed.

Ответы [ 5 ]

3 голосов
/ 14 июля 2020

Ваша reversedSentence строка пуста, поэтому ее индексация вызывает неопределенное поведение. Вместо этого вы можете использовать push_back следующим образом:

for (int i = sentence.length() - 1; i >= 0; i--)
{
    reversedSentence.push_back(sentence[i]);
}

Также обратите внимание, что ваше условие l oop необходимо изменить. В случае, если sentence пусто, вы должны static_cast от .length() до int перед вычитанием на 1, например:

for (int i = static_cast<int>(sentence.length()) - 1; i >= 0; i--)
{
    reversedSentence.push_back(sentence[i]);
}

Вы также можете просто использовать алгоритм для этого:

reversedSentence = sentence;
std::reverse(reversedSentence.begin(), reversedSentence.end());

Это позволяет избежать осложнений, когда строка sentence пуста.

0 голосов
/ 15 июля 2020
for (int i = sentence.length() - 1; i < sentence.length(); i--)

Почему вы пишете бесконечность для l oop ?? вы уменьшаете i, оно всегда будет меньше, чем предложение .length () .... Я бы использовал:

for(int i = sentence.length() - 1; i > 0; i--)

, если бы я был вами ....

0 голосов
/ 14 июля 2020
#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>

int main()
{
    std::string sentence;

    std::cout << "Sentence: ";
    std::getline(std::cin, sentence);

    std::stringstream sstrin(sentence);
    int spaces = std::count(sentence.begin(), sentence.end(), ' ');
    std::vector<std::string> chunks;
    chunks.reserve(spaces + 1);

    while (sstrin) {
        std::string tmp;
        sstrin >> tmp;
        chunks.push_back(tmp);
    }

    std::ostream_iterator<std::string> strout(std::cout, " ");
    std::cout << "Words in reverse:\n";
    std::copy(chunks.rbegin(), chunks.rend(), strout);

    std::cout << "\nFull Mirror:\n";
    std::ostream_iterator<char> charout(std::cout);
    std::copy(sentence.rbegin(), sentence.rend(), charout);
    std::cout << '\n';
}

Немного непонятно, что вы имеете в виду под реверсом. Ваш код указывает на то, что я бы назвал «полным зеркалом», где все символы расположены в обратном порядке. Но есть вероятность, что вам просто нужно перевернуть слова, и это первое, о чем я думаю, когда люди говорят, что хотят перевернуть предложение. В зависимости от того, что вы хотите, go ваше мнение об этом различается.

Для слов в обратном порядке мне нужно убедиться, что каждое слово рассматривается как отдельная сущность. Для этого я объявляю вектор строк, где каждый элемент будет отдельным словом. Я использую строковый поток, поскольку он разделяет слова для меня, без необходимости писать функцию для проверки предложения вручную. Это связано с тем, что по умолчанию потоки разделяются пробелами. Как только вектор заполнится словами, я go о печати их в обратном порядке. Я делаю это с помощью std::ostream_iterator. Это просто более компактно, чем основанное на диапазоне for, и позволяет мне использовать преимущества обратных итераторов вектора; это избавляет меня от необходимости переворачивать вектор.

Для «полного зеркала» я аналогичным образом использую std::ostream_iterator, но он состоит из символов, потому что я использую обратные итераторы исходного предложения. Отдельные элементы строки представляют собой символы.

Наконец, нет указания, нужно ли вам сохранять эти перевернутые предложения, поэтому я не беспокоюсь.

0 голосов
/ 14 июля 2020

Мое предложение: не используйте индексы. По возможности предпочитайте использовать итераторы.

for (auto iter = sentence.rbegin(); iter != sentence.rend(); ++iter)
{
    reversedSentence.push_back(*iter);
}
0 голосов
/ 14 июля 2020

В вашем for-l oop указано, что i < sentence.length() является конечным условием. Это приводит к тому, что он всегда будет true и никогда не будет обращаться к вашему for-l oop, потому что вы объявили i как sentence.length() - 1. Это всегда будет меньше, чем sentence.length().

...