(1)字符与字符串的区别:
1.字符 ‘’ 字符串 “”
2.字符 一个字符形如 ‘a’ ‘0’ ‘!’等,而字符串是一串字符 形如 “shgfys” “hfgs!”
3.字符不能承载字符串,字符串可以是”abcde”这样的,’abcde’这样就是错误的。
4.在scanf和printf中 字符对%c 字符串对%s
(2) char & string
在C语言中,string 是定义一个字符串,存储的是一段如“abcd”的数据,而且最后还有一个结束符’\0’(隐藏);
char 是定义一个字符,存储一个字符,占一个字节。
“a”和’a’的区别,前者是字符串,后者是字符,单引号里的内容表示是字符,双引号里的内容表示是字符串,。
实际上,”a”在内存中一般占2个字节(不是说字符串长度,是占用内存。注意说是一般占2字节,有特殊情况),”a\0”,以’\0’结尾。
而’a’是一个单字符。
每个字符串都有一个’\0’结束符。在C++中sizeof(‘a’)=1,它是占一个字节,sizeof(“a”)=2,它后面还有一个\0结束符;
再强调一次
string 是定义一个字符串,存储的是一段如“abcd”的数据,而且最后还有一个结束符’\0’;
char 是定义一个字符,存储一个字符,占一个字节。
如何定义?
1.单个字符:
语法:char ch=‘a’;
注意1:在显示字符型变量时,用单引号将字符括起来,不要用双引号
注意2: 单引号内只能有一个字符,不可以是字符串
2.字符串类型:
char 变量名[ ]=“字符串值”
下面展示一些 代码。
char str1[]=" hello world";
string 变量名=" 字符串值";
string str2=" hello world"
(3) 字符与整数的联系——ASCII码
每个常用字符都对应一个-128 ~ 127的数字,二者之间可以相互转化。注意:目前负数没有与之对应的字符。
#include <iostream>
using namespace std;
int main()
{
char c = 'a';
cout << (int)c << endl;//强制转化
int a = 66;
cout << (char)a << endl;
return 0;
}
常用ASCII值:’A’- ‘Z’是65 ~ 90,’a’ - ‘z’是97 - 122,0 - 9是 48 - 57。
字符可以参与运算,运算时会将其当做整数:
#include <iostream>
using namespace std;
int main()
{
int a = 'B' - 'A'; //当作整数算,用A,B对应的ASCLL数字来算,'A'- 'Z'是65 ~ 90
int b = 'A' * 'B';
char c = 'A' + 2; //同上转化成char 类型,就是字符
cout << a << endl;
cout << b << endl;
cout << c << endl;
return 0;
}
练习:输入一行字符,统计出其中数字字符的个数。
#include<iostream>
using namespace std;
char a[100];//定义char类型
int main()
{
fgets(a,200,stdin);
int number = 0;
for(int i = 0; a[i]; i++){
if(a[i] >= '0' && a[i] <= '9')//这里 '0' 和 '9' 可以写成 48 和 57,因为a[i]定义为char类型,会自动将其整数转化成char类型
number++;
}
cout << number << endl;
return 0;
}
2>字符数组
字符串 就是 字符数组加上结束符'\0'。
string a1 = "c++"; == char a2[] = {'C', '+', '+', '\0'}; == string a1 = {'C', '+', '+', '\0'};
可以使用字符串来初始化字符数组,但此时要注意,每个字符串结尾会暗含一个’\0’字符,因此字符数组的长度至少要比字符串的长度多 1
char a3[] = "C++"; 自动添加表示字符串结尾的空字符 a3[4]
char a4[6] = "Daniel"; 错误:没有空间可以存放空字符 a4[5]
注意字符数组本身是指针,输入不用&
3>如何读入一行字符串,包括空格:
在字符串数组读入字符串时,与数组不同, 输入字符串时,遇到空格或者回车就会停止,cin和scanf 都如此。
1.char str[100];
fgets(str, 100, stdin); str是变量名,100是读入最大长度,写大些,stdin是文件名//有时候会有回车问题,下面的就不用考虑,详见768题
cin.getline(str,100,'\0')str是变量名,100是读入最大长度,显示99个数,最后一个\0会被省略不显示,\0也可换成其他字符,如'a' 'r' 'm'等,如果是'\0'可以直接不写,换成别的字符要写,表示结束字符。
2,string str;//string型的cin输入,不用在乎回车问题
getling(cin,str);
(4)遍历字符数组中的字符
本质是把字符串当作数组拆分了
字符串 string a = "hello"
cout << a << endl;
输出结为hello
但是将其定义为字符数组 char a[] = "hello"
for(int i = 0,len =strlen(a); i < len; i++) cout << a << endl;//用len存下a的长度,strlen每次都会执行一次,所以存下来减少运算时间
a[1] = 'h' a[2] = 'e' a[3] = 'l'........
输出结果变成了
h
e
l
l
o
也可以写成int(int i = 0;a[i];i++)//原因:a字符串末尾为0,遍历数组是最后一项为0,到0停止遍历。
string的empty和size
string s1, s2 = "abc";
cout << s1.empty() << endl;//看数组是否为空,空为1,不空为0
cout << s2.empty() << endl;//布尔值0为假,非0为真
cout << s2.size() << endl;//测数组大小,与strlen不同的是他已经单独存储了值,不用中间变量len啥的在储存了。
使用基于范围的for语句
遍历数组
for (int i = 0; i < s.size(); i ++ )
cout << s[i] << endl;
可以写成更简便的方法
for (char c: s) cout << c << endl; char 是 s 的类型,s 是字符串,c是一个变量,而c会顺次遍历s的每个字符,把s的每个字符顺次赋值给c
等同于
string s;
for (int i = 0; i < s.size(); i ++ )
char c = s[i]; //把s[i]赋给新变量
for (char &c: s) c = 'a' 当想要改变s的值时,用&c,c在变化同时,s跟着变化
for(auto c: s) auto 是让编译器自己去猜s的类型,猜出来就行,猜不出来就报错