c++ primer 学习之路 (13)4.2.2在数组中使用字符串 strlen 每次读取一行字符串输入 getline() get()

4.2.2 在数组中使用字符串

要将字符串存储到数组中,最常用的方法有两种—将数组初始化为字符串常量、将键盘或文件输入读入到数组中。程序清单4.2演示了这两种方法,它将一个数组初始化为用引号括起的字符串,并使用cin将一个输入字符串放到另一个数组中。该程序还使用了标准C语言库函数strlen( )来确定字符串的长度。标准头文件cstring(老式实现为string.h)提供了该函数以及很多与字符串相关的其他函数的声明。

程序清单 string.cpp

#include<iostream>
#include<climits>
#include<string>
using namespace std;
int main()
{
 const int Size = 15;
 char name1[Size];
 char name2[Size] = "c++owboy";
 cout << "Howdy!I am " << name2 << " what is your name?" << endl;
 cin >> name1;
 cout << "well, " << name1 << " your name has " << strlen(name1) << "letters and is stored\n";
 cout << " in an array of " << sizeof(name1) << "bytes.\n";
 system("pause");
 return 0;
}

sizeof运算符指出整个数组的长度:15字节,但strlen( )函数返回的是存储在数组中的字符串的长度,而不是数组本身的长度。

扫描二维码关注公众号,回复: 2061072 查看本文章

另外,strlen( )只计算可见的字符,而不把空字符计算在内。

cin使用空白(空格、制表符和换行符)来确定字符串的结束位置,这意味着cin在获取字符数组输入时只读取一个单词。读取该单词后,cin将该字符串放到数组中,并自动在结尾添加空字符。

4.2.4 每次读取一行字符串输入

每次读取一个单词通常不是最好的选择。例如,假设程序要求用户输入城市名,用户输入New York或Sao Paulo。您希望程序读取并存储完整的城市名,而不仅仅是New或Sao。

需要采用面向行而不是面向单词的方法。

istream中的类(如cin)提供了一些面向行的类成员函数:getline( )和get( )。

这两个函数都读取一行输入,直到到达换行符。然而,随后getline( )将丢弃换行符,而get( )将换行符保留在输入序列中。下面详细介绍它们,首先介绍getline( )。

1.面向行的输入:getline( )

cin.getline(name,number)

第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数。如果这个参数为20,则函数最多读取19个字符,余下的空间用于存储自动在结尾处添加的空字符。

getline( )成员函数在读取指定数目的字符或遇到换行符时停止读取。

程序清单 instr2.cpp

#include<iostream>
#include<climits>
#include<string>
using namespace std;
int main()
{
 const int Size = 15;
 char name1[Size];
 char name2[Size] = "c++owboy";
 cout << "Howdy!I am " << name2 << " what is your name?" << endl;
 cin.getline(name1, Size);
 cout << "well, " << name1 << " your name has " << strlen(name1) << "letters and is stored\n";
 cout << " in an array of " << sizeof(name1) << "bytes.\n";
 system("pause");
 return 0;
}

2.面向行的输入:get( )

另一种使用get( )的方式是将两个类成员函数拼接起来(合并),如下所示:

cin.get(name,number).get();

之所以可以这样做,是由于cin.get(name,number)返回一个cin对象,该对象随后将被用来调用get( )函数


猜你喜欢

转载自blog.csdn.net/zhangfengfanglzb/article/details/80586261