字符数组-字符串-字符串处理函数
字符数组就是元素类型为字符型的数组。在字符数组中可以存放多个字符,但更多的是存放字符串。
C语言中没有专门的字符串变量,如果要存储一个字符串,可以使用字符数组。此时,数组的每一个元素存放一个字符。
一、用字符数组存放字符序列
- 存储字符’b’、‘o’、'y’到字符数组的前三个元素
char c[10];
c[0] = 'b';
c[1] = 'o';
c[2] = 'y';
- 定义字符数组的时候对字符数组初始化
//注意:此时数组存放的是字符序列,不是字符串
char c[10] = {'T','o','d','a','y'};
char d[10] = {'d','a','y'};
二、用字符数组存放字符串
字符串是由0个或多个字符组成的字符序列,存储时系统自动在字符序列的后面加一个ASCII码值为0的字符’\0’作为字符串的结束标记。
在字符数组存放的字符中,如果没有明确的字符串结束标记,则不能认为字符数组存放的是字符串。在字符串处理过程中,通常需要由程序员显式地为字符串添加结束标记。
用字符串初始化字符数组的三种方式
- 用单个字符的方式初始化字符数组,此时,必须有一个字符是’\0’。
char day[6] = {'T','o','d','a','y','\0'};
- 用字符串常量初始化字符数组
//注意:这两种初始化的方法,字符数组的长度不是10,而是11
//因为还有一个字符串结束标记'\0',这是系统自动加上的。
//定义用于存放字符串的字符数组时,一定要注意,字符数组有足够的长度容纳
//字符串和字符串结束标记
char ch[] ={"I am a boy"};
char s[] = "I am a boy";
三、字符数组的输入输出
字符数组存放字符串时有一下几种输入/输出方法。
- 逐个字符输入/输出。
用字符输入函数getchar()、字符输出函数putchar()或格式化输入/输出函数的"%c"格式逐个字符输入输出。
#inclue <stdio.h>
int main(){
char c[81];
int i;
//输入若干个字符,直到回车换行
for(i = 0;i < 80 && (c[i]=getchar())!= '\n';i++);
c[i] = '\0'; //将换行符修改为字符串结束标记
for(i = 0;c[i] != '\0';i++)//遇到'\0'后结束输出
printf("%c",c[i]);
putchar('\n');
putchar('e');
putchar('n');
putchar('d');
return 0;
运行结果
2. 使用格式说明"%s"输入/输出字符串。
使用格式说明“%s”输入输出字符串时,输入输出表列中是字符数组名,也就是字符数组的起始地址,不能写成数组元素。
程序代码1
#include <stdio.h>
int main()
{
char a[81];
scanf("%s",a);
printf("%s",a);
return 0;
}
运行结果1
当执行scanf("%s",a);语句时,从键盘上输入:student后,系统会自动在字符串的后面加一个终止字符’\0’存放到字符数组a中,而当执行输出语句printf("%s",a);时,将输出字符数组a中的每个字符,直到遇到终止符’\0’结束。运行结果2
注意:由于使用scanf()函数输入数据时的默认分隔符是空格、制表符或者回车,所以输入的字符串中不能含有空格或者制表符。
程序代码2
#include <stdio.h>
int main()
{
char str1[10],str2[10],str3[10];
scanf("%s%s%s",str1,str2,str3);//写成"%s,%s,%s"是不正确的
printf("%s %s %s",str1,str2,str3);
return 0;
}
运行结果
使用scanf()函数连续输入多个字符串时,输入的字符串之间只能用空格、制表符或者回车分隔,否则不能正确地输入字符串。
3. 存放多个字符串时,可使用二维数组,二维数组的每一行存放一个字符串。
char str_array[30][81];//可存放30个字符串,每个字符串最大长度可达80个字符
for(int i = 0;i < 30;i++)
scanf("%s",str_array[i]);
四、字符串处理函数
- 字符串输入输出函数
使用字符串输入/输出函数时,要在程序开始处写预处理命令:#include <stdio.h>
(1) gets(字符数组名)
其功能是从标准输入设备输入一行字符串(以回车结束)存储到字符数组中,函数返回数组的起始地址。
gets(str)读取字符串的功能与下面的程序段等价:
for(i = 0;(str[i] = getchar()) != '\n';i++)//逐个读取字符串,直到遇到换行符
str[i] = '\0'; //将换行符改为串结束标记
(2) puts(字符数组名)
将一个字符串输出到标准输出设备,并将结束标记’\0’转换为换行符。
2. 常用的字符串处理函数
(1) strcat(字符数组1,字符串2/字符数组2)
连接两个字符串。将字符串2连接到字符数组1中字符串的后面,结果放在字符数组1中,函数返回字符数组1的起始地址。字符数组1应有足够的长度。
(2) strcpy(字符数组1,字符串2/字符数组2)
将字符串2复制到字符数组1中。字符数组1原来的内容被覆盖,函数返回字符数组1的起始地址。
注意:不能用str1 = str2完成字符串的赋值,其中str1、str2为字符数组名。
(3) strcmp(字符串1,字符串2)
比较两个字符串的大小:
若字符串1>字符串2,函数值为整数;
若字符串1<字符串2,函数值为负数;
若字符串1==字符串2,函数值为0。
字符串的比较规则:对两个字符串从左至右逐个字符比较,直到出现不同的字符或遇到’\0’为止,如果全部字符都相同,则认为两串相等;若出现不同的字符,则以第一个不相同的字符的大小作为串的大小,函数strcmp()的值就是这两个字符的差值(两个字符比较的是ASCII码值)。
(4) strstr(字符串1,字符串2)
子串定位函数。在字符串1中查找字符串2第一次出现的位置,找到则返回该位置地址,未找到则返回null。
(5) strlen(字符串)
返回字符串的长度,即字符串中字符的个数,不包括结束标记’\0’。
#include <stdio.h>
int main()
{
char str1[100] = "I like apple.";
char str2[] = "What is you like ?";
strcat(str1,str2); //连接两个字符串
puts(str1);
strcat(str2,"emm");
puts(str2);
strcpy(str1,str2);//将字符串2复制到字符数组1中
puts(str1);
char str3[] = "ABC";
char str4[] = "abc";
int cmp1 = strcmp(str3,str4);//比较两个字符串的大小
int cmp2 = strcmp("a","a");
printf("比较结果:%d %d\n",cmp1,cmp2);
char str5[] = "This is a book.";
printf("%d\n",strstr(str5,"is")-str5); //子串定位函数
int length1 = strlen("A B C");//求字符串的长度,即字符串中字符的个数,不包含'\0'
char str6[] = "1 2 3";
int length2 = strlen(str6);
printf("两个字符串的长度分别为:%d %d\n",length1,length2);
return 0;
}
运行结果