一、字符串

1、字符串常量
字符串:是一个或多个字符的序列;一个字符在内存中只占一字节,而字符串本质上是多个字符组成的字符数组。C语言规定,在每一个字符串常量的结尾,系统都会自动加一个字符’\0’作为该字符串的“结束标志符”,系统据此判断字符串是否结束。在 C 语言中,字符串不属于数据类型;字符串有两种存储方式,一种是通过字符数组存储,另一种是通过字符指针存储。如:"How are you"中,空格也是字符,也算是可见的,所以总共有 11 个可见字符,加上’\0’共占 12 字节。
2、字符数组
(1)定义10 字节的连续内存空间:char name[10]; 注意: 如果字符串的长度大于 10,那么就存在语法错误。这里需要注意的是,这里指的“字符串的长度”包括最后的 ‘\0’;如果字符串的长度小于数组的长度,则只将字符串中的字符赋给数组中前面的元素,剩下的内存空间系统会自动用 \0’ 填充。
(2)字符数组的初始化与数组的初始化一样,要么定义时初始化,要么定义后初始化。
1)定义时初始化:

char c[] = "i believe you";//字符串
char d[] = {'i', ' ', 'l', 'i', 'k', 'e', ' ', 'y', 'o', 'u','\0'}; //放于字符数组中的字符串

2)定义后初始化:

char a[10];
a[0] = 'i'; a[1] = ' '; a[2] = 'l'; a[3] = 'o'; a[4] = 'v'; a[5] = 'e'; 
a[6] = ' '; a[7] = 'y'; a[8] = 'o'; a[9] = 'u'; a[10] = '\0';

对于字符数组先定义后初始化也可以整体赋值,但是要调用 strcpy 函数。如:

char a[14];
strcpy(a, "i believe you");

注意:对于字符串 ,或者放于字符数组中的字符串,可以直接使用 printf 的 %s 打印其内容;而对字符数组(结尾没有‘\0’),很显然使用 printf 的 %s 打印其内容是不合适的,字符数组只能逐个输出每个元素。
3、常用字符串处理函数

函数功能

函数的一般形式

功能描述及说明

求字符串长度

strlen(字符串);

函数返回计算字符串的实际长度,即不包括’\0’在内的实际字符串的长度

字符串复制

strcp(字符数组1,字符串2);

将字符串2复制到字符数组 1中,应确保字符数组1足够大以便存储字符串2

字符串前n个字符复制

strncp(字符数组1,字符串2,个数n);

将字符串2前n个字符拷贝到字符数组1中,不像strcpy(),strncpy()不会向dest追加结束标记’\0’; 字符数组1和字符串2所指的内存区域不能重叠,且字符数组1必须有足够的空间放置n个字符;

字符串比较

strcmp(字符串1,字符串2);

比较字符串1和字符串2的大小,结果分为三种情况:当字符串1大于字符串2时,函数返回值大于0;当字符串1等于字符串2时,函数返回值等于0;当字符串1小于字符串2时,函数返回值小于0.字符串的比较方法为:对两个字符串从左至右按字符的ASCII码值大小逐个字符比较,直到出现不同的字符或遇到’\0’为止。也就是说,比较时,当出现第一个不对等的字符时,由这两个字符决定所在字符串大小。

字符串连接

strcat(字符数组1,字符串2);

将字符串2连接到字符数组1中的字符串后面,结果存放在字符数组1中,最后的结束字符’\0’会被覆盖掉,并在连接后的字符串的尾部再增加一个’\0’;函数调用后返回字符数组1的首地址。应确保字符数组1定义的足够大,以便能存放连接后的字符串

将n个字符连接到字符串的结尾

strncat(字符数组1,字符串2,个数n)

strncat()将会从字符串2的开头拷贝n个字符到字符数组1尾部,字符数组1要有足够的空间来容纳要拷贝的字符串;如果n大于字符串2的长度,那么仅将字符串2全部追加到字符数组1的尾部; strncat()会将字符数组1最后的’\0’覆盖掉,字符追加完成后,再追加’\0’

字符串查找

strchr(字符串1,字符)

在字符串1中查找给定字符的第一个匹配之处,如果找到指定的字符则返回该字符所在地址,否则返回NULL

字符串倒序查找

strrchr(字符串1,字符)

按照从后到前的顺序进行在字符串1中查找给定字符的第一个匹配之处,如果找到指定的字符则返回该字符所在地址,否则返回NULL

4、输入输出函数
(1)scanf()函数:输入字符串时,应保证输入的字符串长度不超过数组所能容纳的空间大小;空格、回车或制表符(Tab)作为按%s格式输入字符串的分隔符,不能被读入,输入中遇到这些空白字符时,系统认为字符串输入结束;用 scanf 输入时,不管输入什么,最后“敲”的回车都会被留在缓冲区,如果紧接着要给一个字符变量赋值的话,那么还没等你输入系统就自动退出来了。因为系统自动将回车产生的字符 ‘\n’ 赋给该字符变量了,所以此时对字符变量赋值前要首先清空缓冲区,即在下一个scanf(" %s",string)%s前面可以加空格字符或scanf(" ")getchar()
(2)gets() 函数:从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间。函数gets()将空格和制表符都视为字符串的一部分,因此允许输入带空格的字符串,同时将回车符从缓冲区读走,即在其后再输入字符型数据时,不需要清除缓存。
(3)put()函数:用于从括号内参数给出的地址开始,依次输出储存单元中的字符,当遇到第一个’\0’时输出结束并自动输出一个换行符。但是 puts() 和 printf() 相比不能在输出时,输出除了字符指针变量名或字符数组名之外的内容。