1

Тема: Запис динамічної стрічки у вектор

Привіт. Хочу ввести рядок з символів і записати його у вектор.

cin >> gameName;
item.push_back(gameName);

Проблема полягає в тому, що при вводі двох і більше слів у вектор записується тільки перше слово, тобто слово до першого пробілу. Наприклад, я вводжу "Assassin's Creed" - в один елемент записує тільки одне  слово "Assassin's". Як записати всі слова до одного елементу?
Пробував записувати посимвольно через char, пробував копіювати рядок і записувати скопійований, пробував через ітератор, але нічого не виходить.

Because tomorrow may be gone.

2

Re: Запис динамічної стрічки у вектор

getline(cin, gameName);
item.push_back(gameName);

Підійде?

Maybe a = Just a | Nothing
Подякували: varkon1

3

Re: Запис динамічної стрічки у вектор

0x9111A написав:
getline(cin, gameName);
item.push_back(gameName);

Підійде?

На жаль, ні. Записує все, а перше слово кудись пропадає.

Because tomorrow may be gone.

4

Re: Запис динамічної стрічки у вектор

Щось ви не договорюєте, покажіть певно весь код
У мене отак

Maybe a = Just a | Nothing

5

Re: Запис динамічної стрічки у вектор

Можливо це тому що я звертаюся до елементу через ітератор?

Код

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    cout << "\tMy favorite game list\n" << endl;

    vector<string> item;
    vector<string>::iterator iter;
    //vector<string>::const_iterator myIter;

    string gameName, readyString = "";
    char choose;
    while (true)
    {
        if (item.empty())
        {
            cout << "Your list is empty now. Add item? (y/n) - ";
            cin >> choose;
            if (choose == 'y')
            {
                getline(cin, gameName);
                item.push_back(gameName);
            }
            else if (choose == 'n')
                break;
        }
        //gameName[50];
        if (!item.empty())
        {
            cout << "\nYour list of favorite games:" << endl;//output items of vector
            for (iter = item.begin(); iter != item.end(); ++iter)
            {
                cout << *iter << endl;
            }
            cout << "\nAdd or delete item? (a-add/d-delete/n-nothing) - ";
            cin >> choose;
            if (choose == 'a')//adding item
            {
                getline(cin, gameName);
                item.push_back(gameName);
            }
            else if (choose == 'd')
            {
                int i, j = 0;
                for (iter = item.begin(); iter != item.end(); iter++)
                {
                    cout << j+1 << ". " << *iter << endl;
                    ++j;
                }
                //j = 0;
                cout << "Choose number of item and enter it to delete. Number: ";
                cin >> j;
                for (i = 0; i < item.size(); ++i)
                {
                    if (i == (j-1))
                    {
                        item.erase(item.begin() + i);
                    };
                    //++j;
                }
            }
            else if (choose == 'n')
                break;
        }
    }
    return 0;
}

Because tomorrow may be gone.

6

Re: Запис динамічної стрічки у вектор

Проблема в використанні getline після cin >>
Після виймання "choose (char)" з потоку cin, в ньому залишається символ '\n' (а може ще й '\r' але не будемо про це). І потім getline зчитує цей символ як рядок
Одне з нагуглених рішень

cin << ...
...
cin.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );
getline(...

Гугліть "getline after cin" для деталей

П.С. Оцей шматок можна "оптимізувати"

                cin >> j;
                for (i = 0; i < item.size(); ++i)
                {
                    if (i == (j-1))
                    {
                        item.erase(item.begin() + i);
                    };
                    //++j;
                }
Maybe a = Just a | Nothing
Подякували: LoganRoss, varkon2

7

Re: Запис динамічної стрічки у вектор

Дякую. Вирішило проблему.

cin.ignore(numeric_limits<streamsize>::max(), '\n');
getline(cin, gameName);
item.push_back(gameName);
Because tomorrow may be gone.
Подякували: NagarD1