对于C-风格字符串,有三种方式
char info[100];
cin >> info; //read a word
cin.getline(info, 100); //read a line, discard \n
cin.get(info, 100); //read a line,leave \n in queue
对于string对象, 有两种方式:
string stuff;
cin >> stuff; //read a word
getline(cin, stuff); //read a line, discard \n
两个版本的getline()都有一个可选参数,用于指定使用哪个字符来确定输入的边界:
cin.getline(info,100,':'); //read up to :, discard :
getline(stuff, ':'); read up to :, discard :
在功能上,它们之间的主要区别在于,string版本的getline()将自动调整目标string对象的大小,使之刚好能够存储输入的字符:
char fname[10];
string lname;
cin >> fname; // could be a problem if input size > 9 characters
cin >> lname; // can read a very, very long word
cin.getline(fname, 10); // may truncate input
getline(cin, flame); // no truncation
自动调整大小的功能让string版本的getline()不需要指定读取多少个字符的数值参数。
在设计方面的一个区别是,读取C-风格字符串的函数是istream类的方法,而string版本是独立的函数。这就是对于C-风格字符串的输入,cin是调用对象;而对于string对象输入,cin是一个函数参数的原因。
cin.operator>>(fname); // ostream class method
operator>>(cin, lname); // regular function
题外话
字符串种类:
将string类看作是基于char类型的,string库实际上是基于一个模板累的。
模板basic_string有4个具体化,每个具体化都有一个typedef名称:
typedef basic_string<char> string;
typedef basic_string<wchar_t> wstring;
typedef basic_string<wchar16_t> u16string;
typedef basic_string<wchar32_t> u32string;