【C++语法】C++处理字符串的方式

第一种:用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所以第二个+满足要求

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值