stringstream в c ++ помогает извлекать целые числа, разделенные запятыми, из строки, но не целые числа, разделенные пробелами, с помощью векторов, почему? - PullRequest
0 голосов
/ 13 февраля 2020
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;

int main() {
string str;
getline(cin,str);
stringstream ss(str);
vector<int> arr;
while(!ss.eof()){
    int num;
    char ch;
    ss>>num>>ch;
    arr.push_back(num);
}
for(int i=0;i<arr.size();i++){
    cout<<arr.at(i)<<endl;
}
return 0;

}

Я получаю вывод для 1,2,3,4,5 как 1 2 3 4 5, но для 1 2 3 4 5 это 1 3 5 почему? пробел тоже символ, поэтому он должен работать или я что-то упустил? спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Оператор извлечения «>>» обеспечивает чтение разделенных пробелом целых чисел без чтения разделителя с помощью:

ss >> num; 

вместо дополнительного чтения разделителя в исходном коде:

ss >> num >> ch;

, потому что для Для стандартных потоков флаг skipws устанавливается при инициализации. И это делает более простым чтение разделенных пробелами целых чисел.

Чтобы оба разделителя работали одинаково, добавьте

ss >> noskipws;

, как в следующем коде:

#include <iostream>
#include <sstream>
#include <vector>
using namespace std;

int main () {
  string str;
  getline (cin, str);
  stringstream ss (str);
  ss >> noskipws;
  vector<int> arr;
  while (!ss.eof ()) {
    int num;
    char ch;
    ss >> num >> ch;
    arr.push_back (num);
  }
  for (int i = 0; i < arr.size (); i++) {
    cout << arr.at (i) << endl;
  }
  return 0;
}
0 голосов
/ 13 февраля 2020

Потому что отформатированные операции ввода пропускают пробелы. Таким образом, происходит следующее:

ss >> num // reads integer 1
   >> ch; // skips whitespace after 1 and reads char '2'

На следующей итерации:

ss >> num // skips whitespace after 2 and reads integer 3
   >> ch; // skips whitespace after 3 and reads char '4'

И последняя итерация:

ss >> num // skips whitespace after 4 and reads integer 5
   >> ch; // Encounters eof, nothing is read

Не читать этот символ для пробела списки Или Вы можете использовать std :: noskipws , чтобы изменить это поведение.

...