Loading...
v.krastev avatar v.krastev 54 Точки

Integer Parser със стрйимове

Здравейте!

Опитвам се да направя следното - въвежда се ред от козолата и от там с функция се парсват интеджерите в един масив. Горе-долу го направих но имам следния проблем: тъй като не знам предварително колко трябва да е голям масива, първо чета реда в стринг и после броя колко отделни думи (тоест низове разделени със спейс има) и това слагам за размер на въпросния масив. да речем при вход "1 2 3" има три думи така да се каже, размер на масива - 3 и всичко си е ок. ако входа е да речем "1 2a r" отново са 3 думи, отново размера на масива е три - но има непарснати следните символи - 'a' и 'r'. това предполага юзъра да въведе още две числа, но вече съм заделил масив с размер 3 в които има "1 2 0" - при въвеждане на още две числа се побира само първото, и така ако юзъра е искал да въведе 4 числа, а не три, вече е невъзможно. някакво решение на проблема? или по-скоро друга логика по която да инициализирам масива? мислех за вариант всичко първо да се сложи в стринг и чак тогава да му гледам размера и да ги вкарвам един по един елементите в масива, но ми се струва че трябва да има и по-лесен начин... приемам всякакви предложения, забележки и препоръки! ето и кода.

Благодаря предварително!

Тагове:
0
C++ Fundamentals
Jovanna avatar Jovanna 186 Точки
Best Answer

Тествах, кодът ти е верен.

Предполагам това е поведението на:   int num0;  istringstream iss(str0);    //по-долу в кода

Явно чете и числа, след които са долепени други символи, като взема само цифрите, взима си числото с тях и спира преди останалите символи, нищо че няма спейс.

enter SOME NUMBERS: 1 22e 33ttt 444uu 5 66y
NUMBERS you entered: 1, 22,
enter array elements: 1 22e 33ttt 444uu 5 66y
unparsed numbers: e ttt uu y enter again:      //Enter директно.
array elements:
1 22 33 444 5 66

Code:

cout << "enter SOME NUMBERS: ";
    string str0;
    getline(cin, str0);

    vector<int> data;
    istringstream iss(str0);
    int num0;
    while(iss >> num0)
    {
        data.push_back(num0);
    }
    cout << "NUMBERS you entered: ";
    for (int e : data)
    {
        cout << e << ", ";
    }
    cout << endl;

+ твоят код.

 

 

0
v.krastev avatar v.krastev 54 Точки

Да да, благодаря! Нито вектор съм използвал, нито isalpha, нито atoi... определено помогна, благодаря!

1
Aguzelov avatar Aguzelov 78 Точки

Първо мисля, че vector ще ти свърши по-добра работа. 

    string num="-24 2 90 24 50 76";

    stringstream stream(num);

    std::vector<int> values;
    int n;
    while(stream >> n){
        values.push_back(n);
    }

 

0
v.krastev avatar v.krastev 54 Точки

Благодаря!

0
Jovanna avatar Jovanna 186 Точки

Този код е от лекцията за четене на смесен вход int и стринг. Да не би да не си го копирал правилно?

Иначе, пробвах да го направя с допълнителна функция която проверява всеки символ:

https://pastebin.com/p8YMwp0x

Дано съм ти помогнала!

0
19/01/2018 21:32:03
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.