Читать ввод, разделенный пробелами или символами новой строки...?
Я захватываю входные данные из стандартного потока ввода. Например,
1 2 3 4 5
или
1
2
3
4
5
Я использую:
std::string in;
std::getline(std::cin, in);
Но это просто хватит до новой строки, правильно? Как я могу получить входные данные, независимо от того, разделены ли они пробелом (-ами) строки или строки, используя только iosteam, string и cstdlib?
Ответы
Ответ 1
Просто используйте:
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)
...
}
Ответ 2
Используйте '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
Ответ 3
std:: getline (поток, где to?, разделитель
то есть
std::string in;
std::getline(std::cin, in, ' '); //will split on space
или вы можете прочитать в строке, а затем обозначить ее на основе любого разделителя, который вы хотите.
Ответ 4
Пользователь, нажимая клавишу enter или пробелы, остается тем же.
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];
}
Ответ 5
#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;
}
Ответ 6
int main()
{
int m;
while(cin>>m)
{
}
}
Это будет считаться со стандартного ввода, если оно разделено пробелом или разделено по строке.