string类可以将字符串视为输入到一个简单变量中,像使用一个变量那样使用他。
前提是:使用头文件#include<string>,另外,string类位于名称空间std中,因此需要使用using namespace std;或者std::string 或者using std::string。
在其他方面,又类似字符串那样使用。例如,在声明并初始化的时候,需要给字符串加上双引号或者单引号,像 string abc="aaa"; 这样。
上代码:
#include<iostream> #include<string> //使用string类必须调用头文件string int main() { using namespace std; char aaa[20]; //声明数组 char bbb[20] = "很帅"; //声明数组并初始化 string ccc; //声明string类型变量,注意,使用string 需要启用名称空间std,并且无需指定长度 string ddd = "真的很帅"; //声明string类型变量,并进行初始化,并且无需指定长度 cout << "请输入一个人的名字" << endl; cin.getline(aaa, 20); //读取一行字符串,需要指定长度 cout << "请输入第二个人的名字" << endl; cin >> ccc; //将用户输入的内容赋给变量ccc,注意,因为无需指定长度,因此即使很长也没有关系,但注意,中间不能有空格 cin.get(); //注意,这一行代码是为了舍弃上一行代码cin读取到最后的换行符。假如下一行依然使用cin进行读取,是无需输入这行代码的 string eee; cout << "请输入第三个人的名字,姓和名之间请加空格" << endl; getline(cin, eee); //使用getline(cin,string的变量名)可以读取带空格的字符串,否则只读取字符串中空格之前的字符串 string fff; cout << "第四个人名:" << endl; cin >> fff; //因为使用了cin,因此不需要再使用cin.get()来读取掉换行符。但是如果有空格,空格后的内容并不会被读取到变量fff之中 cout << endl; cout << "你知道么?" << aaa <<" "<< bbb << endl; cout << "再告诉你一个秘密:" << ccc <<" "<< ddd << endl; cout << "第三件事是:" << eee << " 很厉害!" << endl; cout << "第四个人的名字是 " << fff; cout << endl; cout << "第一个人名字的第一个字符是:" << aaa[0] << endl; cout << "第二个人的名字的第二个字符是" << ccc[1] << endl; //注意,读取第二个字符,中括号里面的数字为1,和字符串的方式相同 cout << "string类的字符,可以通过数组那样的方式,来读取其中第N个字符,并且输入的数字为N=1。" << endl; system("pause"); return 0; }
输出结果:
请输入一个人的名字 a b 请输入第二个人的名字 cde 请输入第三个人的名字,姓和名之间请加空格 f g h 第四个人名: i jk 你知道么?a b 很帅 再告诉你一个秘密:cde 真的很帅 第三件事是:f g h 很厉害! 第四个人的名字是 i 第一个人名字的第一个字符是:a 第二个人的名字的第二个字符是d string类的字符,可以通过数组那样的方式,来读取其中第N个字符,并且输入的数字为N=1 。
注意:
①我们可以发现,第四个人名i jk只显示出字符i,而空格和jk则没有被读取。想要读取空格,就需要像第三个人名那样,使用函数getline(cin,string变量名)。
②虽然string类型可以像简单变量那样使用,但也可以被像字符串(数组)那样读取字符串(数组)中的第N个字符。读取方式几乎完全等同于读取字符串(数组)中字符的方法。
③string类型在创建变量时,相对于字符串(数组)那样需要标明长度的方式,显得更安全可靠。而且可以自动根据实际输入的字符串长度调整自己的长度。例如在string abc;的时候,abc的字符串长度为0,在string aaa="ab";的时候,字符串的长度则为3(包括最后的空白字符)。
string类的赋值:
我们知道,当有两个数组aaa,bbb时,其中aaa已经被初始化,但是bbb不能通过赋值的方式,将aaa中的字符串赋给数组bbb,如bbb=aaa;这种方式是错误的。
但是当有两个string类型的变量ccc和ddd时,假如ccc={"abbb"};已被初始化,是可以通过赋值的方式,将ccc的字符串赋给ddd,如ddd=ccc;cout<<ddd;的输出结果是abbb。
string类的相加:
也可以将两个string类型的变量进行相加,并赋值给第三个string变量,后者将被加到前者的字符串的后面。方法是:string变量C=string变量A+string变量B。
例如string ccc = { "abc" };string ddd = "efg";string eee = ccc + ddd;cout << eee;则输出结果为abcefg(注意,中间没有空格或者别的什么)。
也可以直接将第二个string类型变量加到第一个string后面,第一个变量则为原来两个变量拼合起来。方法是 目标string变量 += 被加的string变量。
例如: string ccc = { "abc" };string ddd = "efg";ccc += ddd;cout << ccc;输出结果为abcefg
关于相加,第一种方式是相加的两个变量没有变化,第三个变量为相加两个变量合起来之后的字符串。第二种方式是被变的string变量没有变量,目标string变量变化为两个变量合并起来之后的字符串。
上代码:
#include<iostream> #include<string> int main() { using namespace std; string aa; string bb = "很漂亮"; string cc; string dd = "真的"; //声明四个string变量,其中两个进行初始化 cout << "请输入一个妹子的名字:"; cin >> aa; //要求用户输入一个名字,并赋值给string变量aa cc = aa + bb; //变量cc由aa和bb拼接而成,方式是用加号 cout << cc << endl; cout << endl; aa += dd; //将变量dd加到变量aa的字符串后面 aa += bb; //再将变量bb加到变量aa的字符串后面 cout << aa << endl; //变量aa是由原来的aa后面加上变量dd的字符串,然后后面再加上变量bb的字符串 cout << endl; aa = "杨幂(人称大幂幂)"; //可以直接给已经有字符串的string变量进行赋值 cout << aa << "是一个明星。\n"; //显示新的string变量aa cc = aa; //可以通过直接赋值的方式,将变量aa的值赋值给变量cc cout << cc << "也" << bb << endl; system("pause"); return 0; }
输出结果为:
请输入一个妹子的名字:阿木 阿木很漂亮 阿木真的很漂亮 杨幂(人称大幂幂)是一个明星。 杨幂(人称大幂幂)也很漂亮
在连续相加的时候:
aa += dd; //将变量dd加到变量aa的字符串后面
aa += bb; //再将变量bb加到变量aa的字符串后面
也可以直接通过这样的一行代码来起到相同的效果:
aa += dd += bb;
经过实际测试,两者效果是等效的。
注意:
①string类有自动调节字符串长度的功能。例如变量aa初始长度为0,在用户输入进行赋值后,字符串为4个字节(两个汉字),其后进行两次string变量相加,长度变为20个字节,然后又在之后进行赋值,长度变成18个字节(7个汉字2个括号每个占2个字节)。注意,sizeof 变量名是无法测出string类变量所占空间的,他是动态分配的。
要想测试变量所占空间,需要通过 变量名.size() 这样的方法来进行。如 string aa;cout << aa.size()<< endl; 就是输出string变量aa的长度,结果为0。注意,这种方法不计算最后的空白符
②如果不是string类,而是C-风格的字符串。
可以使用strcat(目标字符串A,字符串B)来将字符串B的内容复制到字符串A的后面;
另外是strcpy(目标字符串A,字符串B)可以将字符串B全部复制到(即理解为赋值)到目标字符串A之中。
但两个存在的问题是可能因为长度超出,而导致数据损坏等问题。
在C函数库里,则是strncpy()和strncat()——多了一个n,并且这两个函数支持指出目标数组的最大允许长度的第三个参数,因此更为安全(避免因数据溢出而导致数据损坏),但增加了程序输入的复杂度。
总之,还是用string类好。
显示字符串的字符数:
在显示字符串的的字符数时,string类的字符串和C-风格的字符串的方法是不同的。注意, 显示字符数 和 显示字符串长度 是不一样的,后者比前者多一个空字符。
①string类显示字符串的字符数的方法如下:变量名.size()。例如 cout << aa.size() << endl; //显示string类字符串的字符数,不包含末尾空字符,但包含空格字符
②显示C-风格的字符串的字符数的方法如下:strlen(变量名)。例如:
char aaa[5] = "abcd"; cout << strlen(aaa) << endl; //显示C-风格字符串的字符数 cout << sizeof(aaa) << endl; //显示C-风格字符串的字符长度,包含结尾空字符
输出的结果分别为:4和5