C++中的字符串有两种,第一种称为C-Style string,来自C语言,另一种基于string类库的方法。
C-风格的字符串是以一个'\0'结尾的char数组,所以声明一个C-风格的字符串数组可以这样写:
1 char charry[5] = {'c','a','t','s','\0'};
或者用两外两种更简便的方法来声明:
1 char charry[10] = "cats"; // '\0'自动添加 2 3 char charry[] = "cats" //让编译器计算长度
C-风格的字符串输入和输出方法
char name[20]; cin >> name; cout << name;
上面的字符串输入存在一个问题:cin对象使用空白(空格、制表符、换行符)来确定字符串的界,因此,上面的字符串输入方法不能输入包含空白的字符串。
较好的方法是使用cin的两个面向行输入的成员函数getline()和get()。这两个函数都读取一行输入,直到达到换行符,随后getline()将丢弃换行符,但是get()将换行符保留在输入序列中。
因此上面的代码可以这样写:
char name[20]; cin.getline(name, 20);
或者
char name[20]; cin.get(name, 20);
使用get()成员函数要注意,由于它保留换行符在输入队列中,所以后面使用cin进行读入时,读取的第一个字符就是换行符,如果不借助帮助,直接在后面使用get()函数将不能跨过该换行符,解决的方法是使用不带任何参数的cin.get()来读取下一个字符(即使是换行符)。
char name[20]; cin.get(name, 20).get();
cin.get()返回一个cin对象,因此可以像上面那样直接在后面调用get()函数。get函数还有很多重载形式,以后的文章中再讨论一下,接下来看看string类的一些基本IO内容。
先看看一小段对比C-风格字符转和string类字符转的输入和输出:
char charr[20]; string str; cin.getline(charr, 20); getline(cin, str); cout << charr << endl; cout << str << endl;
上面的代码中,处理C-风格的字符串使用的是istream的类方法,另一个不是(没有使用句点),这是因为istream的设计中没有处理string对象的类方法,getline(cin, str)使用的是string类的一个友元函数。