2012-02-11 3 views
1

Я пишу программу на C++, которая должна взять входную строку от пользователя, распечатать ее и попросить пользователя снова ввести еще одну строку и снова напечатать ее, пока пользователь не нажмет клавишу возврата без ввода какой-либо строки. В этом случае программа должна выйти.Как выйти из программы при нажатии клавиши возврата?

Я придумал следующее, но оно не работает по желанию. Есть идеи?

int main(){ 

    string surname; 
    int c; 
    while (true) { 
     surname = ""; 
     cout << "Enter surname (RETURN to quit): "; 
     c = cin.get(); 
     if (c == '\n') { 
      break; 
     } 
     cin >> surname; 
     cout << surname << endl; 
    } 
    return 0; 
} 
+0

Нет, я самообучаюсь. Небольшая часть проблемы в заданиях Stanford Engineering Everywhere CS106B. –

+0

Как я уже сказал, небольшая часть проблемы самообучающегося задания-4 http://see.stanford.edu/materials/icspacs106b/H09-Assign1SimpleC.pdf –

ответ

2

Я дам вам несколько советов, чтобы я не решил проблему для вас, но помог вам.

Вам не нужно читать по одному символу за раз, вы можете прочитать каждую строку в переменной string. Кроме того, вам нужно использовать std::getline(std::cin, stringvariable) вместо cin >> stringvariable, потому что последний пропустит все символы новой строки до тех пор, пока не получит символ не-новой строки, поэтому нажатие кнопки ввода само по себе ничего не сделает.

После использования std::getline вы можете указать, что пользователь ввел что-либо путем сравнения длины строки с 0 или вызова empty на ней.

2

Проблема в том, что при запросе строки библиотека iostream всегда будет возвращать одно слово, игнорируя любые пробелы. Это очень полезно в большинстве ситуаций. Но если вы хотите, чтобы обнаружить пустую строку, вы должны прочитать символ, и проверить, если это символ новой строки первый:

while(true) { 
    char c; 
    string surname; 
    cout << "Enter surname (RETURN to quit): "; 
    cin.get(c) 
    if(c == '\n') break; 
    cin >> surname; 
    if(c != ' ' and c != '\t' and c != '\n') 
    surname.insert(0, c); 
} 
return 0; 

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

2

Я не рекомендую использовать cin >> для интерактивной программы. Его поведение четко определено, но часто неожиданно для введенного пользователем ввода. Вместо этого следует использовать что-то вроде:

std::getline(std::cin, surname); 

это всегда будет ждать, пока пользователь печатает кучу вещей и пресс Enter, без нечетных поведения, как буферные данные в потоке для последующих.

5

Вам не нужно инициализировать std::string следующим образом: string surname; surname = ""; Это не обязательно.

Вы можете использовать getline функцию, а затем проверить, если эта строка empty так:

string surname; 
cout << "Enter surname (RETURN to quit): "; 
while (getline(cin, surname)) 
{ 
    if (surname.empty()) 
     break; 
    cout << surname << endl << "Enter surname (RETURN to quit): "; 
} 

Надеется, что это помогает.

Смежные вопросы