C++学习 五、数组与字符串 (2)字符串

字符串

字符串可以看作特殊的char类型的数组,其特殊性表现在数组最后一个元素是空字符'\0'

char mystring[9] {'m', 'y', 's', 't', 'r', 'i', 'n', 'g', '\0'};

'\0'是字符串数组中非常重要的组成部分,strcpy(),strcat(),cout<<等字符串操作都是通过'\0'作为字符串结束的标志。

字符数组初始化

char mystring[9] {'m', 'y', 's', 't', 'r', 'i', 'n', 'g', '\0'};

上面这个初始化太麻烦了,可以直接使用字符串常量进行初始化:

char mystring[9] = "mystring";

字符串常量隐式包含空字符'\0',即"mystring\0"

字符串常量实际上表示的字符串所在的内存地址,这个在指针中会提到。

sizeof(), strlen()

sizeof()计算数组长度

strlen()字符串长度,不包含空字符。

字符串输入

可以通过cin,cin.getline(),cin.get()来从输入流中获取字符串。

cin()从输入流读取字符串,根据空白(空格,制表符,换行符)确定字符串结束位置。

cin.getline(char* name, int strsize)从输入流中读取一行,以换行符确定输入结尾。name是存储数组名,strsize是读取的最大字符数(包括空字符)。该函数会把换行符替换为空字符。

cin.get()从输入流中读取下一个字符,可以读取换行符。
cin.get(char* name, int strsize)从输入流中读取一行,以换行符确定输入结尾,但不会读取和替换换行符。

cin.get(char* name, int strsize), cin.get()的混合使用

char myStr[50];
cin.get(myStr, 4);
//INPUT: How
cout<<myStr;
cin.get(myStr, 4);
//INPUT: are
cout<<myStr;
cin.get(myStr, 4);
//INPUT: you
cout<<myStr;
//Result: Are

上面这一段程序打算分三次向myStr输入字符,但实际上第一次cin.get时读到换行符前的'e',换行符没有被get()读取。这个换行符又被后两次cin.get发现不读取。因此,后两次cout直接输出空字符。

于是可以混用cin.get()读取换行符来保证程序正确运行:

char myStr[50];
cin.get(myStr, 4);
//INPUT: How
cin.get();
cout<<myStr;
cin.get(myStr, 4);
//INPUT: are
cin.get();
cout<<myStr;
cin.get(myStr, 4);
//INPUT: you
cin.get();
cout<<myStr;

cin.get的失效位

如果cin.get(char* name, int strsize)直接读取了一个空行(回车),cin将设置一个失效位(failbit),接下来的输入就直接被阻断了。此时需要通过cin.clear(),cin.sync()恢复输入。

string类

C++98添加了string字符串类,使用起来比字符数组方便很多。string类在<string>文件中。

声明

string mystr1;

初始化

string mystr2 = "mystr";
string mystr3 {"mystring"};

赋值

虽然不能给数组赋值,但可以给string对象赋值:

mystr3 = mystr2;

拼接

string类重载了运算符+,+=用于字符串拼接:

mystr3 += mystr2;
mystr3 += "that's ok";

字符访问

可以像访问数组成员一样访问string对象里的字符:

char s = mystr3[1];

字符串长度

string类提供了size()方法计算字符串长度(不包括空字符):

mystr3.size();

输出字符串

可以通过std::cout直接输出string对象:

std::cout << mystr3;

后记

与字符数组相比,使用string类表示字符串是更好的方法。

下篇开始指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值