warning: comparison between signed and unsigned integer expressions [-Wsign-compare]

274
03 июля 2017, 19:03

Ошибка в 17 строке. Я уже на компилятор Code Blocks грешу (постоянно перлы выдает).

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<string> words; //создаю вектор со словами
    for (string word; cin>>word; ) //считываю слова
    words.push_back(word); //записываю каждое считанное слово в конец вектора
    vector<string> bleep; //создаю второй вектор с нежелательными словами
    bleep[0]="indian"; //инициализирую первое слово вектора
    bleep[1]="bydlo"; //инициализирую второе слово вектора
    bleep[2]="microsoft"; //инициализирую третее слово вектора
    for (int i=0; i<words.size(); ++i) //создаю цикл, выполняемый то количество раз, сколько пользователь ввел слов в первый вектор
        if (words[i]!=bleep[0] && words[i]!=bleep[1] && words[i]!=bleep[2]) //проверяю, является ли каждое последующее слово первого вектора нежелательным, путем поочередного сравнения его с каждым нежелательным словом второго вектора
            cout << words[i] << "\n"; //в случае не совпадения его с нежелательным словом, вывожу проверяемое слово
        else
            cout << "BLEEP\n"; //в случае совпадения, заменяю проверяемое слово словом BLEEP, как нежелательное
}
Answer 1

Ваша программа делает запись в вектор по индексам, выходящим за пределы вектора

vector<string> bleep;
bleep[0]="indian";
...

К процитированному предупреждению эта проблема не имеет никакого отношения.

Либо сразу создавайте вектор с необходимым количеством элементов

vector<string> bleep(3);

либо используйте push_back вместо оператора [].

Answer 2

Похоже, на это ругается?

i < words.size()

Ну так все верно, i у вас знаковый int, а words.size() - это беззнаковый тип size_t.

Вот компилятор и предупреждает (warning - это еще не ошибка, но прислушиваться и понимать, что компилятору не нравится, нужно в любом случае) - во избежание недоразумений - что вы сравниваете знаковое и беззнаковое значение.

Обычно это сравнение не выливается ни во что страшное :), но чисто теоретически выполнение преобразования для сравнения может привести к неожиданному результату.

Update

Вот рабочий код:

#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
    vector<string> words;          //создаю вектор со словами
    for (string word; cin >> word; ) //считываю слова
        words.push_back(word);     //записываю каждое считанное слово в конец вектора
    vector<string> bleep(3);       //создаю второй вектор с нежелательными словами
    bleep[0]="indian";             //инициализирую первое слово вектора
    bleep[1]="bydlo";              //инициализирую второе слово вектора
    bleep[2]="microsoft";          //инициализирую третее слово вектора
    for (size_t i = 0; i < words.size(); ++i) //создаю цикл, выполняемый то количество раз, сколько пользователь ввел слов в первый вектор
        if (words[i]!=bleep[0] &&
            words[i]!=bleep[1] &&
            words[i]!=bleep[2]) // проверяю, является ли каждое последующее слово первого вектора нежелательным,
                                // путем поочередного сравнения его с каждым нежелательным словом второго вектора
            cout << words[i] << "\n"; //в случае не совпадения его с нежелательным словом, вывожу проверяемое слово
        else
            cout << "BLEEP\n"; //в случае совпадения, заменяю проверяемое слово словом BLEEP, как нежелательное
}

Но я бы все же делал так:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
    const vector<string> bleep{"indian","bydlo","microsoft"};
    string word;
    while(cin >> word)
        cout << (find(bleep.begin(),bleep.end(),word) ==
                 bleep.end() ? word : "BLEEP") << "\n";
}
READ ALSO
jQuery. Способ вывода значения атрибута в html при наведении

jQuery. Способ вывода значения атрибута в html при наведении

При наведении на содержимое ссылки (к примеру, "Ссылка 1") она должна поменяться на значение атрибута href в круглых скобках (была "Ссылка 1", а стала...

228
Перебор объекта в jQuery

Перебор объекта в jQuery

Нужно перебрать объект с изображениями, добавляя css стили,css() не подойдет так как нужно учитывать высоту каждого отдельно элемента

212
Вытеснение с под absolute

Вытеснение с под absolute

Есть блок (a), в котором установлено position: absolute

257
Подмена двузначных чисел

Подмена двузначных чисел

Есть вот такой алгоритм, который подменяет цифры:

206