c++的字符及字符串简记
字符
字符常量:用单撇号括起来的一个字符就是字符常量。(注意是一个)
如:**’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是当做一个字符看待的,不是当做两个看待的。
字符数组
对字符数组的初始化。
如:
1 | char c[10] = {'H', 'i', '!', ' ', 'b', 'a', 'b', 'y'}; |
如果花括号里面提供的字符个数大于规定的数组长度,则按语法错误处理。
如果花括号里面提供的字符个数小于规定的数组长度,则按顺序将这些初值赋给前面的那些元素,其余元素用空字符(’\0’)填充。
注意:只能对字符数组的元素赋值,而不能用赋值语句对整个数组赋值
1 | char c[10]; |
如果已经有a和b两个数组。
1 | a = b; // 错误,不能对整个数组整体赋值 |
字符数组的输入与输出
两种方法:
1)逐个字符输入输出
2)将整个字符串一次输入或输出
1 | char c[20]; |
字符数组名代表字符数组的第一个元素c[0]的地址,执行 “cout << c;” 的过程是从c所指向的数组的第一个元素开始逐个(自己往后跑,指针自行增加)输出字符,直到遇到’\0’为止。
注意:
1)输出的字符不包括结束符’\0’
2)如果数组长度大于字符串实际长度,输出遇到‘\0’结束
1 | char c[10] = "ABC"; |
3)如果一个字符数组包含一个以上的‘\0’,则遇到第一个‘\0’时输出就结束
4)用cin从键盘输入一个字符串时,键盘键入的字符串长度应小于字符数组的长度,否则会出现问题
1 | char c[1]; |
字符串
字符串以’\0’作为结束的标志,在系统中,当遇到字符‘\0’就表示字符串到此结束了,由他前面的字符组成有效的字符串。
对于一个字符串常量,系统会自动在所有字符的后面加一个‘\0’作为结束符,然后再把他给存起来。
如:对字符串常量“ABC”,共有3个字符,但是他在内存里面却有4个字节,因为还有个‘\0’是系统自动加上的。
1 | 'a' != "a"; //注意,前者有一个字a,占一个字节,后者有a和\0两个字符,占两个字节 |
所以,在程序中常常依靠检测’\0’的位置来判断字符串是否结束,而不是根据字符数组规定的长度来决定字符串的长度。(注意:如果要用字符数组存字符串,一定要记得让字符数组长度大于字符串长度哦)
可以用字符串常量来初始化字符数组
1 | char c[] = "ABC"; //注意两边是双撇号 |
说明:字符数组并不要求最后一个字符必须是‘\0’,可以不包括‘\0’,随程序设计者需要而定,但为了使字符串的处理方法一致(遇到’\0’结束),人们往往认为地在字符数组的最后加上一个’\0’。
字符串类
字符数组操控字符串的方法太过麻烦,在字符串的运算中,一但字符串的长度超过了字符数组的长度,会带来不必要的危险,所以我们经常是用string来处理日常的字符串的。
在使用方法上,他和int,char一样,只不过你需要先:
1 |
下面介绍运算:
1 |
|
注意: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函数进行输入操作时,对字符数组
1 | char name[Asize]; |
面向行的输入:istream& getline(char *p, int n, char c)
getline()函数读取整行,它使用通过回车键输入的换行符来确定输入结尾。要调用这种方法,可以使用cin.getline()。该函数有两个参数。第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数量。如果参数是20,那么最多可以读取19个字符,余下的空间用于存储自动在结尾处添加的空字符。如果在读取n-1个字符之前遇到终止字符(第三个参数不写,默认为’\n’),则提前结束。getline()成员函数在读取指定数目的字符或遇到换行符时停止读取。
当用getline函数进行输入操作时,对字符串
1 | string name; |
getline(cin, inputLine),其中cin是正在读取的输入流,而inputLine是接收输入字符串的string变量的名称。需要注意的是,它不是类方法。
get和getline的区别
1 | cin.getline(name, Asize,'结束字符'); |
getline不会保留结束字符在缓冲区,而get会保留结束字符在缓冲区
1 | char a[10];char b; |
1 | char a[10];char b; |