Завершение цикла c ++ нажатием Enter - PullRequest
0 голосов
/ 19 ноября 2018

Мне нужно завершить цикл ввода, нажав клавишу ввода. Пытался что-то найти, и у меня тут какой-то парень сказал, что этот код ниже будет работать, к сожалению, нет. Что не так?

#include <iostream>
#include <sstream>

using namespace std;
int main() {
    int a = 0, h = 0, i=0;
    string line;
    int *tab=new int;
    while (getline(cin, line) && line.length() > 0) // line not empty
    {
        stringstream linestr(line);
        while (linestr >> a)// recommend better checking here. Look up std::strtol
        {
           tab[i]=a;
        }
    i++;
    }


    return 0;
}

Давай, спасибо!

Вот код:

#include <iostream>
#include <sstream>
using namespace std;
int main() {
    int a = 0, i=0;
    string line;
    getline(cin, line);
    stringstream linestr(line);
    int *tab = new int[line.size()/2+1]; 
    while ( linestr >> a ) 
    {
        tab[i]=a;
        i++;
    }

    for(int j=0; j<i; j++) cout<<tab[j]<<" ";
    return 0;
}

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Один из способов сделать это - прочитать числа, разделенные пробелами, и поместить их в вектор.

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

int main() {
  std::string line;
  std::vector<int> v;
  std::getline(std::cin, line);
  std::stringstream sstream(line); 
  int i;
  while (sstream >> i) {
    v.push_back(i);
  }
  // Check your input vector.
  /*
  for(auto i : v){
    std::cout << i << std::endl;
  }
  */
}

Пример ввода:

32 22 62 723765 26 62 72 7 -5 7 2 7 152 62 6 262 72
0 голосов
/ 19 ноября 2018

Проблема в вашем коде в том, что вы выделили достаточно места для одного int в

int *tab=new int;

и используют tab, как будто он может содержать столько int с, сколько вам нужно.

Если вам разрешено использовать std::vector, измените приведенную выше строку на:

std::vector<int> tab;

и используйте

while (getline(cin, line) && line.length() > 0) // line not empty
{
    stringstream linestr(line);
    while (linestr >> a)
    {
       tab.push_back(a);
    }
}

Если вам не разрешено использовать std::vector, вам придется выяснить, как бороться с динамической природой tab. В качестве быстрого решения вы можете использовать статически определенный массив и прекратить чтение, как только вы израсходуете емкость массива.

int const MAX_ELEMENTS = 100;
int tab[MAX_ELEMENTS];

...

while (getline(cin, line) && line.length() > 0 && i < MAX_ELEMENTS)
{
    stringstream linestr(line);
    while (linestr >> a)
    {
       tab[i] = a;
       ++i;        // Needs to be here not outside this loop.
    }
}
0 голосов
/ 19 ноября 2018

Проблема

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

Кроме того, ваш внешний while предназначен для цикла, пока не будет введена пустая строка без чисел.

Решение

Если вы хотите прочитать пару чисел в одной строке, тогда цикл не нужен:

getline(cin, line);
stringstream linestr(line);
vector<int> tab; 
while ( linestr >> a ) 
{
    tab.push_back(a);
}

Этот подход использует вектор. Преимущество в том, что вам не нужно знать, сколько цифр у вас будет в итоге. После этого вы можете узнать размер вектора с помощью tab.size() и получить доступ к отдельным элементам точно так же, как для массива.

Другое решение (неоптимальное)

Если для школы вам запрещено использовать вектор, вы можете выбрать субоптимальную замену:

int *tab = new int[line.size()/2+1];   

Это дает оценку максимального числа чисел, которые потенциально могут быть в строке (у вас наверняка будет меньше).

...