第一种:用C语言字符数组的方式
1、字符数组的初始化:
方法一:和普通数组一样初始化
char dog[8] = {'b', 'e', 'a', 'u', 'x', '', 'I', 'I'}; //不是字符串
char cat[8] = {'f', 'a', 't', 'e', 's', 's', 'a', '\0'};//是字符串
注意:字符数组需要以空字符'\0'结尾
将字符数组初始化为字符串的工作看上去冗长乏味——使用大量的单引号,且必须加上空字符,这里有一种更好的、将字符数组初始化为字符串的方法——只需使用一个用双引号括起来的字符串即可,这种字符串被称为字符串常量或字符串字面值。
方法二:通过直接赋值字符串来初始化
char bird[11] = "Mr.Cheeps"
char fish[] = "Bubbles";
用引号括起的字符串隐式地包括结尾的空字符,因此不显式的包括它。
注意:在确定存储字符串所需的最短数组时,别忘了将结尾的空字符计算在内
注意:字符串常量(使用双引号)不能与字符常量(使用单引号)互换。字符常量(如'/S')是字符串编码的简写表示,“S”不是字符常量,它表示的是两个字符(字符S和‘\0’)组成的字符串
2、字符串输入输出
2.1 cin、cout
# include <iostream>
using namespace std;
int main()
{
const int ArSize = 20;
char name[ArSize];
char dessert[ArSize];
cout << "Enter your name:\n";
cin >> name;
cout << "Enter your favorite dessert:" << endl;
cin >> dessert;
cout << "I have some delicious " << dessert;
cout << " for you," << name << endl;
return 0;
}
【运行结果】
Enter your name:
zhang san
Enter your favorite dessert:
I have some delicious san for you,zhang
cin使用空白(空格、制表符和换行符)来确定字符串的结束位置,这意味着cin在获取字符数组输入时值读取一个单词。读取该单词后,cin将该字符串放到数组中,并自动在结尾添加空字符。
2.2 scanf输入,printf输出
# include <iostream>
using namespace std;
int main()
{
char str[10];
scanf("%s", str);
printf("%s", str);
return 0;
}
【运行结果】
输入:TAT TAT TAT
输出:TAT
%s识别空格作为字符串的结尾,因此后两个TAT不会被读入
2.3 每次读取一行字符串输入
iostream中的类(如cin)提供了一些面向行的类成员函数:getline()和get()。这两个函数都读取一行输入,知道到达换行符。然而getline()将丢弃换行符,而get()将换行符保留在输入序列中。
- 2.3.1 getline()
面向行输入:getline()。该函数读取整行,它在使用通过回车键输入的换行符确定输入结尾。
调用方法:cin.getline()。
函数有两个参数:第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数。如果这个参数为20,则函数最多读取19个字符,余下的空间用于存储自动在结尾处添加的空字符。
getline()成员函数在读取指定数目的字符或遇到换行符时停止读取。
例如:假设要使用getline()将姓名读入到一个包含20个元素的name数组中。可以:cin.getline(name, 20);
# include <iostream>
using namespace std;
int main()
{
const int ArSize = 20;
char name[ArSize];
char dessert[ArSize];
cout << "Enter your name:\n";
cin.getline(name, ArSize);
cout << "Enter your favorite dessert:" << endl;
cin.getline(dessert, ArSize);
cout << "I have some delicious " << dessert;
cout << " for you," << name << endl;
return 0;
}
【运行结果】
Enter your name:
Alistair Dreeb
Enter your favorite dessert:
Radish Torte
I have some delicious Radish Torte for you,Alistair Dreeb
- get()
get并不再读取并丢弃换行符,而是将其留在输入队列中
调用方式:cin.get()
方法一:
cin.get(name, ArSize);
cin.get();
cin.get(dessert, ArSzie);
方法二:
cin.get(name, ArSize).get();
第二种:基于string类库
要使用string类,必须在程序中包含头文件string
string头文件在c++里有三种含义
#include <string> c++标准库提供的string类
#include <string.h> c标准库提供的字符串函数
#include <cstring> c++对标准c字符串处理函数的c++增强
字符串的定义和初始化
# include <iostream>
# include <string>
using namespace std;
int main()
{
string s1 = "haha";
string s2 = s1; //可以将一个string对象赋给另一个string对象
return 0;
}
string类的其他操作(头文件cstring提供这些函数)
1.strlen()
strlen函数可以得到字符数组中第一个\0前的字符的个数
格式:strlen(字符数组);
2.strcmp()
strcmp函数返回两个字符串大小的比较结果,比较原则是按字典序
格式:strcmp(字符数组1,字符数组2);
返回结果:①如果字符数组1<字符数组2,则返回一个负整数
②如果字符数组1 == 字符数组2,则返回0
③如果字符数组1 > 字符数组2 ,则返回一个正整数
3.strcpy()
strcpy函数可以把一个字符串复制给另一个字符串
格式:strcpy(字符数组1, 字符数组2);
注意:是把字符数组2复制给字符数组1,这里的“复制”包括了结束符\0
4.strcat()
strcat()可以把一个字符串紧接到另一个字符串后面
格式:strcat(字符数组1, 字符数组2);
注意:是把字符数组2接到字符数组1后面
两种确定字符串中字符数的方法
方法一:
string str1;
int len1 = str1.size();
方法二:
char charr1[20];
int len2 = strlen(charr1);
将一行输入读取到字符数组中的代码
char charr[20];
cin.getline(charr, 20);
将一行输入读取到string对象中的代码
string str;
getline(cin, str);
遍历字符串中的字符
//遍历字符数组中的字符
# include <iostream>
# include <cstring>
using namespace std;
int main()
{
char a[100] = "hello world!";
for(int i = 0; i < strlen(a); i++) cout << a[i] << endl;
return 0;
}
//遍历字符串中的字符
# include <iostream>
# include <string>
using namespace std;
int main()
{
string str = "hello world!";
for(int i = 0; i < str.size(); i++) cout << str[i] << endl;
return 0;
}
//基于范围的for语句
# include <iostream>
using namespace std;
int main()
{
string s = "hello world";
for(char c : s) cout << c << endl;
for(char &c : s) c = 'a';
cout << s << endl;
return 0;
}
字符串的拼接
可以使用运算符+将两个string对象合并起来,还可以使用运算符+=将字符串附加到string对象的末尾
string s1, s2, s3;
s3 = s1 + s2;
s3 += s2;
☆字面值和string对象相加
做加法运算时,字面值和字符都会被转化成string对象,因此直接相加就是将这些字面值串联起来
把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符的两侧的运算对象至少有一个是string
string s1;
string s2="hello"+"world"+s1;
string s3=s1+"world"+"hello";
//s2错误,因为+左右至少有一个为string
//s3正确,因为s1+"world"是一个string所以第二个+满足要求