C++ Считалка. Проблема с зацикливанием

264
21 октября 2021, 22:50

Пишу код под задачу со считалкой в строке и одномерным массивом с людьми. Через поток делю строку на слова и через while выполняю считалку один раз. А нужно пять раз. Вроде зациклил и написал переменную n,чтобы каждый раз отсчет начинался со следующего человека,но оно не работает,т.е. выводит 5 раз тот же результат. В чем может быть проблема?

#include <iostream>
#include <sstream>
#include <string>
#include <Windows.h>
using namespace std;
int main(){
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
std::string sch("Эни, бени, рики, таки, Турба, урба, синтибряки, Эус, бэус, краснобэус, Бац!");
std::cout << "Считалочка: " << sch << endl;
int n,j,i;
int people[5];
people[0] = 1;
people[1] = 2;
people[2] = 3;
people[3] = 4;
people[4] = 5;
cout << "Нумерация людей: ";
for (i = 0; i < 5; i++)
{
    printf("%2d", people[i]);
}
cout << endl;
std::stringstream ss(sch);
n = 0;
for (j = 0; j < 5; j++)
{
    while (!ss.eof())
    {
        std::string s;
        ss >> s;
        i = n;
        while (ss >> s)
        {
            i++;
            if (i > 4)
                i = 0;
        }
    }
    cout << people[i] << endl;
    n++;
}

}

Answer 1

Читайте свой же код и пытайтесь себе рассказать что написали:

while (!ss.eof())

Пока не достигли признака конца ввода(когда достигнете, установится failbit) { std::string s; ss >> s; вводим из строкового потока строку(кстати std::istringstream обьект вполне достаточно) i = n;

    while (ss >> s)

пока вводим из потока строку.... Это значит, что если все нормально, то вы достигнете конца ввода после выхода из цикла, поэтому условие внешнего цикла не выполнится и строка будет инициализирована последней строкой из потока. Получается что внешный абсолютно бесполезный

    {
        i++;
        if (i > 4)
            i = 0;
    }

А это зачем, если вы потом всеравно пытаетесь инициализировать значением n ( i = n; ) }

В общем написан бессмысленный код.

Насколько я понел вам нужен типа такого:

std::istringstream ss(sch);
std::string s;  
for (j = 0; ss >> s; j++)
{           
    if (j > 4)
        j = 0;      
    cout << people[j] << endl;      
}

ОБНОВЛЕНИЕ

Чтобы повторить все это, с началом отсчета от следующего, нужен такой цикл:

int j = -1; // чтобы ++j == 0
for (int i = 0; i < 5; ++i) {
    while (ss >> s) ++j;
    // if ( j > 4 ) j = 0; можно заменить на j % 5
    j %= 5;
    cout << people[j] << endl;
    //после цикла нужно  установить gootbit
    ss.clear();
    //и начать читать заново от начала
    ss.seekg(0, std::ios_base::beg);        
}

Или же проще:

int n = 0, j = -1;
while (ss >> s) ++n;    
for (int i = 0; i < 5; ++i) {
    j += n;
    // if ( j > 4 ) j = 0; можно заменить на j % 5
    j %= 5;
    cout << people[j] << endl;              
}
READ ALSO
Полиморфизм и указатели на функции

Полиморфизм и указатели на функции

Можно ли считать указатели на функции одним из способов реализации статического полиморфизма?

91
Очередь на языке С++

Очередь на языке С++

Пытаюсь решить следующую задачу: создать пользовательскую очередь, в которой каждый элемент равен сумме предыдущих, первый элемент равен...

83
Что я упустил text text

Что я упустил text text

Получается бесконечный цикл

108