2015-08-04 2 views
0
#include <iostream> 
#include <string> 

using namespace std; 


int main() 
{ 
    int num; 
    cin >> num; 
    string s; 
    getline(cin, s); 
    cout << s << " " << num << endl; 
    return 0; 
} 

В этом коде, если я ввожу 3 и нажимаю клавишу ввода, s берет пустую строку.C++: Механизм функции Getline

1) Если он принимает первый символ в качестве символа новой строки, то есть ли возможное решение взять строку в качестве ввода после ввода целого числа в качестве ввода?

2) Если мой вход 4567artyu, то как он решает, должен ли 7 идти в s или num?

+0

Непонятно, каков ваш первый вопрос. Если первым символом является символ новой строки, ваш ine пуст. Если это не так, это не так. –

+0

Возможный дубликат [Нужна помощь с getline()] (http://stackoverflow.com/questions/1744665/need-help-with-getline) – NathanOliver

+0

например, если я хочу 24 числа и «45tyu» в s .. то как мне это сделать? –

ответ

3

Я рекомендую вам всегда читать полные строки ввода от ваших пользователей. Это вызовет наименьшую путаницу.

  • Запросить ввод.
  • Используйте std::getline, чтобы прочитать строку ввода.
  • Если вам не нужна строка, но, скажем, целое число, используйте std::stoi или (более общий) boost::lexical_cast, чтобы безопасно преобразовать вход в желаемый целевой тип. Это то, где вы ломаете плохие входы и жалуетесь на пользователя.

Я не думаю, что многие пользователи, если запрос на номер, было бы ожидать, что ввод 42bananas будет принят как 42 и bananas часть быть «вспомнили» для последующего использования. Скорее всего, это будет опечатка, и пользователь будет рад, если вас попросят исправить его.

-2

Попробуйте использовать cin.clear, прежде чем строка прием

+0

'clear()' очищает флаги ошибок в потоке. Он не очищает входные данные в потоке. – NathanOliver

0

Для принятия линии в качестве входных данных после приема целого числа в качестве входных данных вы можете рассмотреть возможность удаления паразитного «\ п» символ из потока.

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    int num; 
    cin >> num; 
    getchar(); 
    string s; 
    getline(cin, s); 
    cout << s << " " << num << endl; 
    return 0; 
} 

Это сделает трюк.

Для второго вопроса он читает 4567 как целое число, он будет продолжать читать его как целое, пока не будет достигнут предел int и если предел достигнут, после этого он ничего не рассмотрит. Затем он поместит максимальное значение int в переменную num и null int string s. Если предел не достигнут, строка останется во входном потоке как есть, и будет выбрана переменной s.