Удаление пробелов из входного потока только с помощью функций istream

Есть ли способ удалить конечный пробел после ввода десятичной дроби? Например.:

10        A

Я хочу поймать первый символ после окончания пробела. (Что должно быть \n, чтобы быть правдой. Если нет, то ложь

Моя попытка до сих пор:

cout << "Please enter a number: ";
cin >> n;

if (cin.peek() == ' ')
    //Something to catch the whitespaces

if(cin.fail() || cin.peek() != '\n')
    cout << "Not a number." << endl;

else
    cout << "A number." << endl;

Возможно ли это сделать с помощью функций в istream?

(Я знаю, что cin.fail может делать добрые дела, но он все равно не считает ввод 10А ошибкой)


person user2180833    schedule 28.03.2013    source источник
comment
Просто получите всю строку, и вы обнаружите, что результирующая строка намного лучше для извлечения этой информации.   -  person chris    schedule 28.03.2013
comment
Дубликат stackoverflow.com/questions/710604/   -  person Stuart P. Bentley    schedule 12.04.2016


Ответы (3)


Как сказал @chris, вы действительно хотите начать с чтения всей строки, а затем продолжить чтение оттуда.

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

std::stringstream buffer(line);

buffer >> n;

char ch;
if (buffer >> ch) 
    cout << "Not a number";
person Jerry Coffin    schedule 28.03.2013

Я немного смущен тем, что вы пытаетесь сделать. Вы говорите, что пытаетесь избежать пробелов?

cin пропускает их... это допустимый пустой разделитель, такой как табуляция или новая строка. Если вы сделаете:

int A(0), B(0);

std::cin >> A >> B;

введенные числа будут идти в A, пока вы не наберете пробел, затем они будут идти в B.

Если вы используете строки и хотите объединить их в одну без пробелов;

std::string A, B, C;
std::string final;

std::cin >> A >> B >> C;

std::stringstream ss;
ss << A << B << C;
final = ss.str();

Однако, как упомянул Джерри, если вы имеете дело со строками, вы можете просто выполнить std::getline(), что, возможно, доставит вам меньше головной боли.

person Oria    schedule 28.03.2013

Спасибо за вашу помощь. Со строками это будет легко, да. Хотя пользоваться им запрещено.

Можно сделать вот таким простым методом:

cout << "Please enter a number: ";
cin >> n;

while (cin.peek() == ' ')
   cin.ignore(1,' ');

if(cin.fail() || cin.peek() != '\n')
   cout << "Not a number." << endl;

else
   cout << "A number." << endl;
person user2180833    schedule 01.04.2013