2014-11-22 6 views
1

Привет всем, поэтому я читал о std :: cin.get() func и читал, что мы используем его для захвата символа новой строки, который был введен после ввода любого ввода в консоль. Но я немного запутался при написании небольшой очень простой программы и не мог понять ее поведения.пытается понять std :: cin.get()

поэтому моя программа предназначена для упражнений в C++ primer plus. В любом случае код ниже:

#include <iostream> 
#include <cstring> 

void countWords() { 
    char word [100]; 
    char wordDone [] = "done"; 
    int count = 0; 

    std::cout << "Enter words (to stop, type the word done): \n"; 
    std::cin >> word; 

    while (strcmp(word, wordDone) != 0) { 
    std::cin >> word; 
    count += 1; 
    } 

    std::cout << "You entered a total of " << count << " words."; 

    std::cin.get(); 
    std::cin.get(); 
} 

int main() { 
    countWords(); 

    std::cin.get(); 
    return 0; 
} 

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

Но если вместо создания вышеуказанного countWords() func, если я напишу весь код в main() func, он отлично работает, что меня очень сбивает с толку.

Как я понимаю, когда я вхожу в массив символов в консоли и нажимаю return, буфер хранит данные консоли и новую строку в очереди, а после того, как цикл while обрабатывается и отображается cout, возвращается по первому std :: cin.get(). Итак, программа должна дождаться, когда я войду в другое возвращение, которое затем будет отменено вторым cin.get(), и оно также должно спросить меня о другом возврате, так как в главной функции также есть cin.get(). Но по какой-то причине, которую я не могу понять, выходной экран просто исчезает.

Любые комментарии или объяснения пожалуйста ??

+0

Вы должны только нажать дважды войти, согласно тому, что вы описали. –

ответ

2

Казалось бы, у вас что-то застряло в буфере, из-за чего все ваши get s будут заполнены.

Я хотел бы предложить следующее:

cin.ignore(-1, '\n'); 
+0

Эффект 'sync()' определяется реализацией. Попробуйте сделать 'std :: cin.ignore (-1, '\ n')' вместо этого более стандартным способом отбрасывания символов. – 0x499602D2

-2

cin.get() возвратит EOF, если нет доступных символов в потоке и установить failbit потока. Я подозреваю, что это то, что происходит, поэтому ваша программа будет просто проходить через все ваши cin.gets и не ждать другого символа возврата.

Для выяснения того, как IStream :: получить работы: istream::get

+1

+ -1: 'cin.get()' вернет EOF, если поток достигнет конца файла, что не происходит для стандартного ввода, если вы не наберете Ctrl + D (или эквивалент вашего терминала). Это очень мало связано с тем, сколько доступных символов находится в буфере потока (_buffer_, а не «в потоке»: потоки - это не контейнеры, а потоки данных). –

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