字符
字符常量:用单撇号括起来的一个字符就是字符常量。(注意是一个)
如:‘A’,‘a’,‘1’,‘2’。
转义字符
转义字符是一种特殊的字符,他有两个或多个字符组成,但是他只代表一个字符。
编译系统在见到字符“\”后,会接着找他后面的字符,并且把它处理成一个字符,在内存中只占一个字节。
转义字符’ \ ‘代表的反斜杠" \ “,转义字符” \’ “代表的字符” ’ "和转义字符’ " ‘代表的字符’"’,其本身就是可显示字符,为什么还要对它转义呢?
这是因为它们的原有的字符形式已作它用,其中,单引号用作区分字符常量的括号,双引号用作区分字符串的括号,而反斜杠本身已用来表示转义字符的开头,因此必须对它们用转义字符重新声明。
转义字符注意点:
1)转义字符中只能使用小写字母,每个转义字符只能看作一个字符。
如:\n(换行), \t(制表符), \a(响铃,你的电脑会叫一声), \0(空字符),以上只能小写,还有的如“\101”(字母A),这则是八进制的方法,还有16进制的,如果需要请自行查找
2)\v垂直制表和\f换页符对屏幕(你的小黑框)没有任何影响,但会影响打印机执行响应操作。
4)转义字符’\0’表示空字符NULL,它的值是0。而字符’0’的ASCII码值是48。因此,空字符’\0’不是字符0。另外,空字符不等于空格字符,空格字符的ASCII码值为32而不是0。
5)如果反斜线之后的字符和它不构成转义字符,则’\’不起转义作用将被忽略。
如:你输出“\c”,"\A",最后只会出来"c"和“A”。
6)转义字符也经常出现在字符串中,如你在一句话的末尾加一个\n,这时候就会换行,注意,这个时候\n是当做一个字符看待的,不是当做两个看待的。
字符数组
对字符数组的初始化。
如:
char c[10] = {'H', 'i', '!', ' ', 'b', 'a', 'b', 'y'};
char c[] = {'H', 'i', '!', ' ', 'b', 'a', 'b', 'y'};
如果花括号里面提供的字符个数大于规定的数组长度,则按语法错误处理。
如果花括号里面提供的字符个数小于规定的数组长度,则按顺序将这些初值赋给前面的那些元素,其余元素用空字符(’\0’)填充。
注意:只能对字符数组的元素赋值,而不能用赋值语句对整个数组赋值
char c[10];
c = {'H', 'i', '!', ' ', 'b', 'a', 'b', 'y'}; //错误,不能对整个数组一次性赋值,只有初始化的时候可以类似地这样做
c[0] = 'C';
c[1] = 'H';
c[3] = 'i';
c[4] = 'n';
c[5] = 'a'; // 这样是正确的
如果已经有a和b两个数组。
a = b; // 错误,不能对整个数组整体赋值
a[0] = b[0]; // 正确,对数组元素赋值
字符数组的输入与输出
两种方法:
1)逐个字符输入输出
2)将整个字符串一次输入或输出
char c[20];
cin >> c;
cout << c;// 输出整个字符串
cout << c[0]; //输出单个字符
字符数组名代表字符数组的第一个元素c[0]的地址,执行 “cout << c;” 的过程是从c所指向的数组的第一个元素开始逐个(自己往后跑,指针自行增加)输出字符,直到遇到’\0’为止。
注意:
1)输出的字符不包括结束符’\0’
2)如果数组长度大于字符串实际长度,输出遇到‘\0’结束
char c[10] = "ABC";
cout << c; // 只输出ABC三个字符,而不是10个字符,这就是结束标志的作用
3)如果一个字符数组包含一个以上的‘\0’,则遇到第一个‘\0’时输出就结束
4)用cin从键盘输入一个字符串时,键盘键入的字符串长度应小于字符数组的长度,否则会出现问题
char c[1];
cin >> c; // 输入123
cout << c; //输出123
/*系统不报错,也能正常输出,因为他将多余的字符放在了后面的字节里面,
这样有可能会破坏其他的数据,不安全,甚至可能出现无法估计的后果
所以一定要保证字符串长度小于字符数组长度*/
字符串
字符串以’\0’作为结束的标志,在系统中,当遇到字符**‘\0’**就表示字符串到此结束了,由他前面的字符组成有效的字符串。
对于一个字符串常量,系统会自动在所有字符的后面加一个‘\0’作为结束符,然后再把他给存起来。
如:对字符串常量“ABC”,共有3个字符,但是他在内存里面却有4个字节,因为还有个‘\0’是系统自动加上的。
'a' != "a"; //注意,前者有一个字a,占一个字节,后者有a和\0两个字符,占两个字节
所以,在程序中常常依靠检测’\0’的位置来判断字符串是否结束,而不是根据字符数组规定的长度来决定字符串的长度。(注意:如果要用字符数组存字符串,一定要记得让字符数组长度大于字符串长度哦)
可以用字符串常量来初始化字符数组
char c[] = "ABC"; //注意两边是双撇号
char c[] = {'A', 'B', 'C', '\0'}; //第一行与这一行等价
char c[] = {'A', 'B', 'C'}; // 与这一行不等价
说明:字符数组并不要求最后一个字符必须是‘\0’,可以不包括‘\0’,随程序设计者需要而定,但为了使字符串的处理方法一致(遇到’\0’结束),人们往往认为地在字符数组的最后加上一个’\0’。
字符串类
字符数组操控字符串的方法太过麻烦,在字符串的运算中,一但字符串的长度超过了字符数组的长度,会带来不必要的危险,所以我们经常是用string来处理日常的字符串的。
在使用方法上,他和int,char一样,只不过你需要先:
#include <string>
下面介绍运算:
#include <string>
string s1,s2; // 定义字符串
s1 = "ABC"; // 赋值
s2 = s1; // 赋值
cin >> s1;
cout << s1; // 输入与输出
s1 = s2; //字符串复制
s1 = s1 + s2; //字符串连接
cout << s1.length(); //输出字符串长度,还有其他的操作方法,请自行查找函数库
// 字符串比较直接用 > < >= <= == != 即可
注意:string,cstring,和string.h的区别
string是C++的string类。
cstring包含一些C字符串的操作函数,它里面有一些常用的C字符串处理函数,比如strcmp、strlen、strcpy、strcat之类的函数,它与原来的<string.h>对应。但cstring头文件的内容在名字空间std 中,而string.h不在。
cstring里面的函数不能操作string对象,string对象有它自己的函数来操作,cstring可以和纯字符串(“ABC”)或者字符数组玩耍。
下面引用一下别人关于头文件的说明并作了些增添:
下面是C++头文件的现状:
(1)旧的C++头文件名如 <iostream.h>将会继续被支持,这些头文件的内容不在名字空间std 中。新的C++头文件如 iostream包含的基本功能和对应的旧头文件相同,但头文件的内容在名字空间std 中。(在标准化的过程中,库中有些部分的细节被修改了,所以旧头文件和新头文件中的实体不一定完全对应。)
(2)标准C 头文件如 <stdio.h>继续被支持。头文件的内容不在std 中。具有C 库功能的新C++头文件具有如 cstdio这样的名字。它们提供的内容和相应的旧C 头文件相同,只是内容在std 中。
前面加个c代表着它是继承标准c的头文件。
由于cin的输入会跳过空格,换行,tab符之类的空白字符,所以有时候会使用getline函数来进行输入
当用getline函数进行输入操作时,对字符数组
char name[Asize];
cin.getline(name, Asize,'结束字符'); // 注意格式,一般第三个参数不输入的话默认为换行符
面向行的输入:istream& getline(char *p, int n, char c)
getline()函数读取整行,它使用通过回车键输入的换行符来确定输入结尾。要调用这种方法,可以使用cin.getline()。该函数有两个参数。第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数量。如果参数是20,那么最多可以读取19个字符,余下的空间用于存储自动在结尾处添加的空字符。如果在读取n-1个字符之前遇到终止字符(第三个参数不写,默认为’\n’),则提前结束。getline()成员函数在读取指定数目的字符或遇到换行符时停止读取。
当用getline函数进行输入操作时,对字符串
string name;
getline(cin, name); // 注意格式
getline(cin, inputLine),其中cin是正在读取的输入流,而inputLine是接收输入字符串的string变量的名称。需要注意的是,它不是类方法。
get和getline的区别
cin.getline(name, Asize,'结束字符');
cin.get(name, Asize,'结束字符');
getline不会保留结束字符在缓冲区,而get会保留结束字符在缓冲区
char a[10];char b;
cin.get(a,10,',');// get
cin.get(b);
cout<<a<<endl<<b;
//输入12345,回车
//输出12345【换行】,
//注意,因为缓冲区里面还有逗号(结束字符),
//所以在get单个字符的时候,就直接把这个结束字符获取了
//cin.get(a,10,',')把12345到a中,遇到','结束,但是不把','删除,而把','输入到b中
char a[10];char b;
cin.getline(a,10,','); //getline
cin.get(b);
cout<<a<<endl<<int(b);
//输入12345,回车
//输出12345【换行】10
//cin.getline(a,10,',')把12345输入到a中,遇到’,‘结束,并删除缓冲区的‘,’,
//后面的[enter]输入到b中
//回车的ascil码为10