第七章字符串
7.1初识字符串
C语言本身并没有设置一种类型来定义字符串变量,而是将字符串存储于字符数组来进行处理,但字符数组并不等同于字符串变量。
字符串以字符‘\0’作为结束标志,C语言对字符串常量是按照字符型一维数组进行存储的。
对于字符串常量,C编译系统会自动在末尾添加一个‘\0’作为结束符。例如:字符串常量”Hello”共有5个字符,长度为5,但在内存中占6个字节,最后一个字符存储的是‘\0’。
对于字符数组,字符数组的每个元素可存放一个字符,但并不要求它的最后一个字符必须为字符串结束标志‘\0’。而与字符串有关的大量操作都与字符串结束标志‘\0’有关。
因此,只有在字符数组中的有效字符后加上‘\0’这一特定情况下,才可以把这种字符数组“看作”字符串变量。
由此我们可以得出,字符串变量初始化的格式
- char c[20]=”computer & c”;
由于”computer & c”是字符串常量,系统会自动在最后加入字符串结束标记‘\0’,所以不必人为加入,此时应注意数组越界。
下面的写法的错误的
char c[12]=”computer & c”;原因是没有为‘\0’预留空间,这样就不是字符串变量了。
所以我们最终采取下面的形式定义。
char c[]=”computer & c”;
//数组大小为13,字符串长度为12
对于通过逐个数组元素赋初值的方法进行初始化,必须在最后加上‘\0’。只有加上结束符,这个字符数组才能看作字符串变量。
注意
①通过指针代替一维数组定义字符串,只能定义成字符串常量,不能定义出可修改内容的字符串变量。
当把字符串用指针指向时,c编译系统中不会自动添加‘\0’作为结束符,所以这是一个字符串常量,所以在后续的程序中,不能通过访问指针地址的方式去修改内容。
②
通过一维数组进行存储的字符串,为字符串变量,即通过访问数组元素,直接修改字符串内容。
7.2字符串的输入与输出
(1)使用scanf函数和printf函数
Scanf函数和printf函数可以用于输入和输出单个字符(%c),也可以输入和输出字符串(%s)
由上述代码运行结果可知,
当函数是循环输入单个字符(%c),一共读取了13个字符,赋予了数组str,按照上面的输入,赋给元素str[12]的是换行字符,所以输出时多了一个空行。
当函数输入字符串(%s)的时候,以空格、制表、回车符作为字符串的间断符号。因此在第二次输入时也输入了字符串“computer & c”,但遇到了第一个空格符合的时候,字符串已经间断。所以printf函数只会输出“computer”。
(2)gets函数
同为输入函数,get函数不同于scanf函数的地方是,使用gets函数可以完整地读入带有空格的字符串,其一般形式为
调用gets函数时,将从str存放的字符串的起始地址开始依次存放从终端键盘读入的字符串(包括空格符),直到输入换行符为止。
(3)puts函数
输出函数,其一般形式有两种
不带引号时,其中str是存放字符串的起始地址,puts函数从这一地址开始依次输出存储单元中的字符,遇到第一个‘\0’符号时结束输出,并自动换行。
带引号时,puts函数直接输出引号内的内容,直接得到“C语言”。
7.3字符串的处理函数
(1)字符串连接函数strcat
其函数定义格式为:
char *strcat(char *dest, const char *src);
函数的返回值是指针,为地址。
其函数调用格式为:
strcat(字符数组名1,字符串2)
功能:把字符串2连接到字符数组1中字符串的后面,并删去字符串1的串标识符‘\0’,结果字符串的长度是两个字符串长度之和。字符串2可以是字符数组,也可以是字符串常量。函数返回值是字符数组1的首地址。
注意:在使用strcat函数时,必须包含头文件<string.h>。同时字符数组1应定义足够长的长度。
(2)字符串复制函数strcpy
其函数定义格式为:
char *strcpy(char* dest, const char *src);
是一个指针函数,函数的返回值是指针,为地址。
其函数调用格式为:
strcpy(字符数组名1,字符串2)
功能:把字符串2连同串结束标志‘\0’复制到字符数组1中。字符串2可以是字符数组,或字符串常量,当字符串2是字符串常量时,相当于把一个字符串赋予一个字符数组。函数返回值是字符数组1的首地址
strcpy函数要求字符数组1的长度不小于字符串2的长度,否则会出问题
(3)字符串比较函数strcmp
功能为比较两个字符串的大小
其函数定义格式为:
int strcmp(const char *s1,const char *s2);
其函数调用格式为:
strcmp(字符串1,字符串2)
其中,字符串1和字符串2可以是字符数组名或字符串常量。
函数返回值是一个整数,即:
- 若字符串1=字符串2,函数返回值为0;
- 若字符串1>字符串2,函数返回值为一个正整数;
- 若字符串1<字符串2,函数返回值为一个负整数。
字符串比较的方法是:
从左到右按照ASCII码大小比较两个字符串对应位置上的字符,若相等
则继续比较,直到出现不同的字符或遇到‘\0’为止。
若全部字符相同,则认为相等;若出现不同字符,以第一个不同的字符的比较结果为准,并由函数返回值返回比较结果。
注意:C语言不允许使用关系运算符比较两个字符串大小,例如:
if(st1>st2), printf(“st1>st2\n”);
(4)测字符串长度函数strlen
其函数调用格式为
strlen(字符串)
功能:计算字符串的实际长度(不包含字符串结束标志‘\0’),并作为函数返回值,例如: