第十章 字符串

第十章 字符串

1,用一维字符数组存放字符串

在C语言中,字符串是借助于字符型一维数组来存放的,并规定一字符’\0’作为“字符串结束标志”。‘\0’是一个转义字符,称为“空值”,它的ASCII代码值是0。‘\0’作为标志占用存储空间,但不计入串的实际长度。虽然在C语言中没有字符串数据类型,但允许使用“字符串常量”。
C语言中字符串常量给出的是地址值:每一个字符串常量都分别占用一串连续的存储空间,这些连续的存储空间实际上就是字符型一维数组。这些数组虽然没有名字,C从编译程序却以字符串常量的形式给出存放每一字符串的存储空间的首地址。不同的字符串具有不同的起始地址。也就是说:在C语言中,字符串常量被隐含处理成一个以‘\0’结尾的无名字符型一维数组。因此:char *sp,s[10]; s=”Hello!”是不合法的,因为字符串常量在赋值过程中给出的是这个字符串在内存中所占的一串连续存储单元(即无名一维字符数组)的首地址,而s是一个不可重复赋值的数组名,而sp=”Hello!”是合法的。
字符数组和字符串的区别:字符数组的每一个元素中可存放一个字符,但他并不限定最后一个字符应该是什么,而在C语言中,因为有关字符串的大量操作都与串结束标志有关,因此在字符数组中的有效字符后面加上‘\0’这一特定情况下,可以把这种一维字符型数组“看做”字符串变量,但他又不同于一般的变量。如上所示,仅可以在字符数组内存放字符串,不能通过赋值语句将字符串常量或其他字符数组中的字符串直接赋给字符串变量。
赋值:
(1)用给一般数组赋初值的相同方式给一维字符数组赋初值
char str[10]={‘s’,’t’,’r’,’I’,’n’,’g’,’\0’};
或者(2)在赋初值时直接赋字符串常量
char str[10]={“string!”};或者 char str[10]=”string!”;
(3)在C程序执行过程中给一维字符数组赋字符串
不可以用赋值语句给字符数组整体赋一串字符;给数组元素逐个赋字符值,最后人为加入串结束标志

2.是指针指向一个字符串

(1)通过赋初值的方式是指针指向一个字符串
如 char *ps1=”form one”;或者char str[]=”form ong”,*sp1=str;
(2)通过赋值运算是指针指向一个字符串
如:char *ps1; ps1=”form one”;或者char *ps2,str[]=”form two”; ps2=str;

第十章 字符串

3.字符串的输入和输出

对于字符串,可以利用%c格式说明或字符输入、输出函数逐个输入、输出字符,输入是在后面人为加结束标志,从而构成字符串,输出时用’\0’作为结束标志;还可以用格式说明符%s及字符串输入、输出函数
(1) 输入输出的必要条件
当对字符串进行输出时,输出项既可以是字符串常量或字符数组名,也可以是已指向字符串的字符指针变量。
(2) scanf(“%s”,str);str可以是字符数组名,字符数组元素的地址或字符指针变量
printf(“%s”,str);
(3) 调用gets,puts函数在终端输入或输出一行字符串
char str[20];
gets(str);
puts(str);

4.字符串数组

char ca[ ][5]={“A”,”BB”,”CCC”};

A \0 ----- ------ ----
B B \0
C C C \0

char *p[3]={“a”,”bb”,”ccc”};

第十章 字符串

5.用于字符串处理的函数

在程序前面的命令行指定包含标准头文件<string.h>
拷贝strcpy(s1,s2);
连接strcat(s1,s2);
求长strlen(s1,s2);
比较strcmp(s1,s2);