4.2.4 每次读取一行字符串输入(1)
每次读取一个单词通常不是最好的选择。例如,假设程序要求用户输入城市名,用户输入New York或Sao Paulo。您希望程序读取并存储完整的城市名,而不仅仅是New或Sao。要将整条短语而不是一个单词作为字符串输入,需要采用另一种字符串读取方法。具体地说,需要采用面向行而不是面向单词的方法。幸运的是,istream中的类(如cin)提供了一些面向行的类成员函数:getline( )和get( )。这两个函数都读取一行输入,直到到达换行符。然而,随后getline( )将丢弃换行符,而get( )将换行符保留在输入序列中。下面详细介绍它们,首先介绍getline( )。
1.面向行的输入:getline( )
getline( )函数读取整行,它使用通过回车键输入的换行符来确定输入结尾。要调用这种方法,可以使用cin.getline( )。该函数有两个参数。第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数。如果这个参数为20,则函数最多读取19个字符,余下的空间用于存储自动在结尾处添加的空字符。getline( )成员函数在读取指定数目的字符或遇到换行符时停止读取。
例如,假设要使用getline( )将姓名读入到一个包含20个元素的name数组中。可以使用这样的函数调用:
这将把一行读入到name数组中-如果这行包含的字符不超过19个。(getline( )成员函数还可以接受第三个可选参数,这将在第17章讨论。)
程序清单4.4将程序清单4.3修改为使用cin.getline( ),而不是简单的cin。除此之外,该程序没有做其他修改。
程序清单4.4 instr2.cpp
下面是该程序的输出:
该程序现在可以读取完整的姓名以及用户喜欢的甜点!getline( )函数每次读取一行。它通过换行符来确定行尾,但不保存换行符。相反,在存储字符串时,它用空字符来替换换行符(参见图4.5)。
|
| 图4.5 getline( )读取并替换换行符 |