C ++ Новичок в отношении Векторов и циклов for / while - PullRequest
1 голос
/ 26 июля 2011

Я пытаюсь сделать что-то, что будет принимать строки ввода от пользователя, разделять их на строки в векторе, а затем печатать их по одной за раз (по 8 на строку). пока это то, что я получил:

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

int main(void)
{
    using namespace std;

    vector<string> svec1;
    string temp;
    while(getline(cin, temp)) //stores lines of text in temp
    {
        if(temp.empty()) //checks if temp is empty, exits loop if so.
            break;
        stringstream ss(temp);
        string word;
        while(ss >> word) //takes each word and stores it in a slot on the vector svec1
        {
            svec1.push_back(word);
        }            
    }        
}

Я застрял на том, чтобы печатать их по 8 за раз, решения, которые я пробовал, продолжают выводить индекс из-за ошибок диапазона.

Ответы [ 3 ]

2 голосов
/ 26 июля 2011

Примерно так:

for(int i = 0; i < svec1.size(); i++)
{
    cout << svec1[i];
    if ((i+1) % 8 == 0)
        cout << endl;
    else
        cout << " ";
}

EDIT:
Решение выше выводит дополнительный пробел / перевод строки в конце. Этого можно избежать, например, так:

for(int i = 0; i < svec1.size(); i++)
{
    if (i == 0)
        /*do nothing or output something at the beginning*/;
    else if (i % 8 == 0)
        cout << endl; /*separator between lines*/
    else
        cout << " "; /*separator between words in line*/
    cout << svec1[i];
}
0 голосов
/ 26 июля 2011

Пройдите по вашему вектору с индексом:

for (unsigned int idx = 0; idx < svec1.size(); ++idx) {
   std::cout << svec[idx] << sep(idx); // sep(idx) is conceptual; described below
}

Что это за sep(idx)?Это разделитель для печати после слова idx th .Это

  • Новая строка после печати восьми слов в строке.idx будет 7, 15, 23 и т. д.: один не равен целому числу, кратному 8. В коде (idx+1)%8 == 0.
  • Новая строка для последнего элемента в векторе;Вы, вероятно, хотите, чтобы за последним пунктом следовал символ новой строки.В коде idx+1 == svec.size().
  • В противном случае пробел.

Простой способ сделать это с помощью троичного оператора:

for (unsigned int idx = 0; idx < svec1.size(); ++idx) {
   const char * sep = (((idx+1)%8 == 0) || (idx+1 == svec.size())) ? "\n" : " ";
   std::cout << svec[idx] << sep;
}

Если вы невот так,

for (unsigned int idx = 0; idx < svec1.size(); ++idx) {
   const char * sep;
   if (((idx+1)%8 == 0) || (idx+1 == svec.size())) {
      sep = "\n";
   }
   else {
      sep = " ";
   }
   std::cout << svec[idx] << sep;
}
0 голосов
/ 26 июля 2011

Обычно вы перебираете вектор с помощью предложения цикла for. Поэтому, если вы хотите распечатать все элементы вашего vector<string>, вы должны сделать что-то вроде этого:

for(vector<string>::iterator it = myvec.begin(); it != myvec.end(); ++it) {
    cout << *it;
}

РЕДАКТИРОВАТЬ: как правильно написал Влад, вы также можете использовать индексы массивов, которые менее эффективны в списках, но одинаково эффективны с векторами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...