cin
for InputIf a program is going to use a loop to read text input from the keyboard, it has to have some way of knowing when to stop. How can it know when to stop? One way is to choose some special character, sometimes called a sentinel character, to act as a stop sign. For example, Listing 5.16 stops reading input when the program encounters a #
character. The program counts the number of characters it reads and then echoes them. That is, it redisplays the characters that have been read. (Pressing a keyboard key doesn’t automatically place a character onscreen; programs have to do that drudge work by echoing the input character. Typically, the operating system handles that task. In this case, both the operating system and the test program echo the input.) When it is finished, the program reports the total number of characters processed. Listing 5.16 shows the program.
// textin1.cpp -- reading chars with a while loop
#include <iostream>
int main()
{
using namespace std;
char ch;
int count = 0; // use basic input
cout << "Enter characters; enter # to quit:
";
cin >> ch; // get a character
while (ch != '#') // test the character
{
cout << ch; // echo the character
++count; // count the character
cin >> ch; // get the next character
}
cout << endl << count << " characters read
";
return 0;
}
Here’s a sample run of the program in Listing 5.16:
Enter characters; enter # to quit:
see ken run#really fast
seekenrun
9 characters read
Apparently, Ken runs so fast that he obliterates space itself—or at least the space characters in the input.
Note the structure of the program in Listing 5.16. The program reads the first input character before it reaches the loop. That way, the first character can be tested when the program reaches the loop statement. This is important because the first character might be #
. Because textin1.cpp
uses an entry-condition loop, the program correctly skips the entire loop in that case. And because the variable count
was previously set to 0
, count
has the correct value.
Suppose the first character read is not a #
. In that case, the program enters the loop, displays the character, increments the count, and reads the next character. This last step is vital. Without it, the loop repeatedly processes the first input character forever. With the last step, the program advances to the next character.
Note that the loop design follows the guidelines mentioned earlier. The condition that terminates the loop is if the last character read is #
. That condition is initialized by reading a character before the loop starts. The condition is updated by reading a new character at the end of the loop.
This all sounds reasonable. So why does the program omit the spaces on output? Blame cin
. When reading type char
values, just as when reading other basic types, cin
skips over spaces and newline characters. The spaces in the input are not echoed, so they are not counted.
To further complicate things, the input to cin
is buffered. That means the characters you type don’t get sent to the program until you press Enter. This is why you are able to type characters after the #
when running the program in Listing 5.16. After you press Enter, the whole sequence of characters is sent to the program, but the program quits processing the input after it reaches the #
character.
3.15.12.34