字符串是存储在内存的一系列字符。C++处理字符串有两种方式
第一种来自C语言,即字符数组。
第二种来是基于string类库的方法。
C风格的字符串具有一种特殊的性质:以空字符结尾(空字符表示为' '),其ASCII码值为0,用来标记字符产结尾。
例如一下两个例子:
char a[5]={'a','b','c','d',' '};//a string
char b[5]={'a','b','c','d','e'};//not a string
注意:在确定字符串存储所需的最短数组是,注意别忘了将结尾' '计算在内。
char a[9];
cout<<sizeof(a);
其中sizeof(a)测试的是整个数组的长度,即9*sizeof(a[0]);
在使用cin输入字符串的时候,容易掉入一个小陷阱。比如下面一段程序:
#include <iostream> using namespace std; int main() { const int arSize=20; char name[arSize]; char dessert[arSize]; cout<<"Enter your name:"<<endl; cin>>name; cout<<"Enter your favorite food"<<endl; cin>>dessert; cout<<"I have some delicious "<<dessert; cout<<" for you, "<<name<<endl; return 0; }
下面是程序的运行截图
还没来得及输入甜点,就已经被认为输入结束。因为不能通过键盘输入空字符(' '),因此cin使用别的方法(空格,制表符,换行符)来确定字符串结束的位置,这就意味着cin在获取字符串数组的时候之获取了前面的一个单词。而将空格后面的单词通过第二个cin。
解决方方法有两种面向行的输入。
第一种:调用cin.getline(arrayname,length);两个参数分别是字符数组的名称和要输入的长度。当按下enter之后最后的换行符将会被装空字符替换。
第二种:调用cin.get(arrayname,length),参数和前面的意思是一样的。区别在于get不在读取并且丢弃换行符。
cin.get(name,ArSize);
cin.get(dessert.ArSize);
由于第一次调用之后换行符留在了队列当中。当第二次调用的时候读取的是换行符,会认为该字符串已经输入结束。
正确的使用方法:
cin.get(name.ArSize);
cin.get(dessert,ArSize);
混合输入字符串和数字的时候
#include <iostream> using namespace std; int main() { cout<<"What year is your hourse built?"<<endl; int year; cin>>year; cout<<"What is its street address? "; char address[80]; cin.get(); cin.getline(address,80); cout<<"Year built:"<<year<<endl; cout<<"Address"<<address<<endl; cout<<"Done"<<endl; return 0; }运行结果
原因和上面的一样,输入数字之后的换行符被getline读到了。解决办法,在getline前面加上一个cin,get()
string类和字符数字大体相似。但是string用起来更加安全和方便。其主要区别是课件string对象声明成简单变量而不是数组
string str;
string str2="panhter";
类的设计可让程序自动处理string'的大小。string的声明创建一个长度为0的string。当输入读到string时将自动调节string的长度.