читать ввод, разделенный пробелом (ами) или символом новой строки ...? - PullRequest
19 голосов
/ 21 апреля 2011

Я получаю данные из стандартного потока ввода. Например,

1 2 3 4 5

или

1
2
3
4
5

Я использую:

std::string in;
std::getline(std::cin, in);

Но это просто до новой строки, верно? Как я могу получить данные, разделены ли они символом перевода строки или пробелами, используя только iosteam, string и cstdlib?

Ответы [ 6 ]

28 голосов
/ 21 апреля 2011

Просто используйте:

your_type x;
while (std::cin >> x)
{
    // use x
}

operator>> пропустит пробел по умолчанию.Вы можете связать вещи, чтобы прочитать несколько переменных одновременно:

if (std::cin >> my_string >> my_number)
    // use them both

getline() читает все в одной строке, возвращая это, независимо от того, пусто оно или содержит десятки разделенных пробелами элементов.Если вы предоставите необязательный альтернативный разделитель ala getline(std::cin, my_string, ' '), он все равно не будет выполнять то, что вам нужно, например вкладки будут считаны в my_string.

Вероятно, для этого не нужно, но это довольно распространенное требование.В скором времени вас может заинтересовать чтение одной строки, разделенной новой строкой, и разделение ее на компоненты ...

std::string line;
while (std::getline(std::cin, line))
{
    std::istringstream iss(line);
    first_type first_on_line;
    second_type second_on_line;
    third_type third_on_line;
    if (iss >> first_on_line >> second_on_line >> third_on_line)
        ...
}
5 голосов
/ 21 апреля 2011

Используйте 'q' в качестве необязательного аргумента для getline.

#include <iostream>
#include <sstream>

int main() {
    std::string numbers_str;
    getline( std::cin, numbers_str, 'q' );

    int number;
    for ( std::istringstream numbers_iss( numbers_str );
          numbers_iss >> number; ) {
        std::cout << number << ' ';
    }
}

http://ideone.com/I2vWl

1 голос
/ 13 сентября 2014

пользователь нажимает ввод или пробелы совпадают.

int count = 5;
int list[count]; // array of known length
cout << "enter the sequence of " << count << " numbers space separated: ";
// user inputs values space separated in one line.  Inputs more than the count are discarded.
for (int i=0; i<count; i++) {
    cin >> list[i];
}
1 голос
/ 21 апреля 2011

std :: getline (поток, куда ?, разделитель т.е.

std::string in;
std::getline(std::cin, in, ' '); //will split on space

или вы можете прочитать в строке, а затем токенизировать ее в зависимости от того, какой разделитель вы хотите.

0 голосов
/ 21 января 2016
int main()
{
    int m;
    while(cin>>m)
    {
    }
}

Это будет считывать из стандартного ввода, если он разделен пробелом или строкой.

0 голосов
/ 24 мая 2013
#include <iostream>

using namespace std;

string getWord(istream& in) 
{
    int c;

    string word;

    // TODO: remove whitespace from begining of stream ?

    while( !in.eof() ) 
    {

        c = in.get();

        if( c == ' ' || c == '\t' || c == '\n' ) break;

        word += c;
    }

    return word;
}

int main()
{
    string word;

    do {

        word = getWord(cin);

        cout << "[" << word << "]";

    } while( word != "#");

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