字符数组-字符串-字符串处理函数

字符数组就是元素类型为字符型的数组。在字符数组中可以存放多个字符,但更多的是存放字符串。
C语言中没有专门的字符串变量,如果要存储一个字符串,可以使用字符数组。此时,数组的每一个元素存放一个字符。

一、用字符数组存放字符序列

  1. 存储字符’b’、‘o’、'y’到字符数组的前三个元素
char c[10];
c[0] = 'b';
c[1] = 'o';
c[2] = 'y';
  1. 定义字符数组的时候对字符数组初始化
//注意:此时数组存放的是字符序列,不是字符串
char c[10] = {'T','o','d','a','y'};
char d[10] = {'d','a','y'};

二、用字符数组存放字符串

字符串是由0个或多个字符组成的字符序列,存储时系统自动在字符序列的后面加一个ASCII码值为0的字符’\0’作为字符串的结束标记。
在字符数组存放的字符中,如果没有明确的字符串结束标记,则不能认为字符数组存放的是字符串。在字符串处理过程中,通常需要由程序员显式地为字符串添加结束标记。

用字符串初始化字符数组的三种方式

  1. 用单个字符的方式初始化字符数组,此时,必须有一个字符是’\0’。
char day[6] = {'T','o','d','a','y','\0'};
  1. 用字符串常量初始化字符数组
//注意:这两种初始化的方法,字符数组的长度不是10,而是11
//因为还有一个字符串结束标记'\0',这是系统自动加上的。
//定义用于存放字符串的字符数组时,一定要注意,字符数组有足够的长度容纳
//字符串和字符串结束标记
char ch[] ={"I am a boy"};
char s[] = "I am a boy";

三、字符数组的输入输出

字符数组存放字符串时有一下几种输入/输出方法。

  1. 逐个字符输入/输出。
    用字符输入函数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;

运行结果

将多个对象字符串转换为list java 将多个字符串存入数组_字符数组


2. 使用格式说明"%s"输入/输出字符串。

使用格式说明“%s”输入输出字符串时,输入输出表列中是字符数组名,也就是字符数组的起始地址,不能写成数组元素。

程序代码1

#include <stdio.h>

int main()
{
 	char a[81];
 	scanf("%s",a);
 	printf("%s",a);
 	return 0;
}

运行结果1

将多个对象字符串转换为list java 将多个字符串存入数组_1024程序员节_02


当执行scanf("%s",a);语句时,从键盘上输入:student后,系统会自动在字符串的后面加一个终止字符’\0’存放到字符数组a中,而当执行输出语句printf("%s",a);时,将输出字符数组a中的每个字符,直到遇到终止符’\0’结束。运行结果2

将多个对象字符串转换为list java 将多个字符串存入数组_1024程序员节_03


注意:由于使用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;
 }

运行结果

将多个对象字符串转换为list java 将多个字符串存入数组_字符数组_04


使用scanf()函数连续输入多个字符串时,输入的字符串之间只能用空格、制表符或者回车分隔,否则不能正确地输入字符串。

3. 存放多个字符串时,可使用二维数组,二维数组的每一行存放一个字符串。

char str_array[30][81];//可存放30个字符串,每个字符串最大长度可达80个字符
for(int i = 0;i < 30;i++)
	scanf("%s",str_array[i]);

四、字符串处理函数

  1. 字符串输入输出函数
    使用字符串输入/输出函数时,要在程序开始处写预处理命令:#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; 
 }

运行结果

将多个对象字符串转换为list java 将多个字符串存入数组_1024程序员节_05