一、 字符数组的思想及意义:
前两个单位我们操作的都是一些数值型数据,整型或浮点型;但是在程序设计中字符中的处理是非常有用的。比如有一篇文章以文件的形式存在计算机中,如是要统计这篇文章有多少个单词,或都查找有没有出现某个关键词,就需要学习字符串的处理技术,还要用到C语言库中提供的字符串处理函数。
字符串的处理基于字符数组,字符数组就是字符串,因些,要从字符数组的定义讲起。
字符数组的意义就是用数组方法来解决基于字符串的处理操作。
二、 什么是字符、字符串、字符数组
即然知道了字符数组是来解决基于字符串的处理操作的。那么我们先来分一下字符,字符串,字符数组又该怎么解释呢。
- 1. 字符:一般提到的字符包括字母符号、数字符号、还有一些特殊符号。其实计算机的键盘上的每个键都是一个字符,字母区分大小写。
- 2. 字符串:由多个字符组合成一个整体我们就称为字符串。汉字只能用字符串表示。1个汉字等于2个字符
- 3. 字符数组:程序设计中字符串必须用字符数组来体现。用来存放字符数据的数组就是字符数组。
三、 字符、字符串与字符数组的关系
知道了什么是字符,字符串,字符数组其实我们应该也能总结出来了,字符数组是可以包含多个字符,多个字符连接起来后就是字符串了,而字符串的程序语言中表示必须通过字符数组来使用。
四、 字符数组
数组在现实生活,及软件开发过程中使用非常灵活,一维数组可以分为整型一维数组、浮点型一维数组及字符型一维数组;二维数组及多维数组分法也和一维数组分法一样,下面我们主要讲解字符数组中的一维字符数组。
- 1. 字符数组的定义格式
(1) 一维数组的定义的形式始下:
char 数组名[常量表达式];
例如
char name[100];
char sex[10];
(2) 对于字符数组的定义说明如下请参考第十单元一维数组的定义说明部分:
- 2. 字符数组的初始化
(1) 单个字符赋值在定义数组时对数组元素赋以初值(同整型)。例如:
char a[5]={'a','b','c','d','e'};把值放在一个大括号中依次以逗号分隔,相当于a[0]='a',a[1]='b',a[2]='c',a[3]='d',a[4]='e';其中' '括起来只能是单个字符,字符常量的意思。
(2) 上述方法在字符数组中使用非常少主要用如下两种方法:
① char 字符数组名[最大字符数+1]=“字符串”;
② char 字符数组名[]=”字符串”;默认长度是字符串字符个数+1。
③ char 字符数组名[最大字符数+1]=“字符串”; char 字符数组名[]={”字符串”}
注:双引号“”的外面可以加上{}变成{“”}也是对的,一般情况下用“”是不加{}的。
总结:字符数组初始化方式共三种
字符数组初始化:(在定义字符数组同时,对数组元素赋以初值)有以下三种
①char a[20]={'n','m','1','\n','0'};
②char a[20]="nm1\n0";
③char a[20]={"nm1\n0"};
#include "stdio.h" void main() { char name[100]; printf("请输入姓名:"); scanf("%s",name); printf("你的姓名是:%s\n",name);
注:只有在定义字符数组的时候可以用赋值符号给字符数组整体赋值,定义完字符数组以后,再用赋值符号给字符数组整体赋值是错误的。
char a[5];
a[5]=”mnop”;这样写法是错误的
一、 字符串函数的应用
字符串常用函数可以很方便的让我们操作字符数组,字符串函数有很多,可参考《C语言函数库》查看各种函数的应用,今天我们来学习下列四个常用的字符串函数:strcmp(),strlen(),strcpy(),strcat等。下面我们就依次来讲下这些函数的应用方法。
- 1. gets()函数----输入字符串
(1) 调用方式:gets(字符数组)
(2) 函数功能:从标准输入设备(stdin)──键盘上,读取1个字符串(可以包含空格),并将其存储到字符数组中去。
(3) 使用说明
① gets()读取的字符串,其长度没有限制,以敲回车键结束。编程者要保证字符数组有足够大的空间,存放输入的字符串。
② 该函数输入的字符串中允许包含空格,而scanf()函数不允许。
(4) 应用代码如下
/*利用gets()给数组赋值 */ #include "stdio.h" void main() { char name[100]; printf("请输入字符串:"); gets(name); }
- 2. puts()函数----输出字符串
(1) 调用方式:puts(字符数组)
(2) 函数功能:把字符数组中所存放的字符串,输出到标准输出设备中去,并用‘\n’取代字符串的结束标志‘\0’。所以用puts()函数输出字符串时,不要求另加换行符.
(3) 使用说明
① 字符串中允许包含转义字符,输出时产生一个控制操作。
② 该函数一次只能输出一个字符串,而printf()函数也能用来输出字符串,且一次能输出多个。
(4) 应用代码如下
/*利用gets()给数组赋值 */ #include "stdio.h" void main() { char name[100]; printf("请输入字符串:"); gets(name); printf("输入字符串是:"); puts(name); }
- 3. strcmp()函数----字符串比较 compare
(1) 调用方式:strcmp(字符串1 ,字符串2)
其中“字符串”可以是串常量,也可以是1维字符数组。
(2) 函数功能:比较两个字符串的大小。
如果:字符串1等于字符串2,函数返回值等于0;
字符串1大于字符串2,函数返回值正整数1。
字符串1小于字符串2,函数返回值正整数-1。
(3) 使用说明
① 如果一个字符串是另一个字符串从头开始的子串,则母串为大。
② 不能使用关系运算符“==”来比较两个字符串,只能用strcmp() 函数来处理。
(4) ACM应用代码如下
/*功能:简单密码检测程序*/ #include "stdio.h" #include "string.h" void main() { char pass_str[80]; /*定义字符数组passstr*/ int i; /*检验密码*/ for(i=1;i<=3;i++) { printf("请输入密码\n"); gets(pass_str); /*输入密码*/ if(strcmp(pass_str,"password")!=0) /*口令错*/ printf("口令错误,还有%d次机会\n",3-i); else { printf("登录成功\n");/*输入正确密码所进入的程序段*/ break; /*输入正确的密码,中止循环*/ } } }
- 1. strcpy()函数----拷贝字符串
(1) 调用方式:strcpy(字符数组, 字符串)
其中“字符串”可以是串常量,也可以是字符数组。
(2) 函数功能:将“字符串”完整地复制到“字符数组”中,字符数组中原有内容被覆盖。
(3) 使用说明
① 字符数组必须定义得足够大,以便容纳复制过来的字符串。复制时,连同结束标志'\0'一起复制。
② 不能用赋值运算符“=”将一个字符串直接赋值给一个字符数组,只能用strcpy()函数来处理。
(4) ACM应用代码如下
/*利用strcpy()操作数组 */ #include "stdio.h" void main() { char name1[100]=“zhangsan”; char name2[100]=”lisi”; strcpy (name1,name2); printf("新数组1是:%s",name1); }
- 2. strcat()函数----字符串连接
(1) 调用方式:strcat(字符数组, 字符串)
其中“字符串”可以是串常量,也可以是字符数组。
(2) 函数功能:把“字符串”连接到“字符数组”中的字符串尾端,并存储于“字符数组”中。“字符数组”中原来的结束标志,被“字符串”的第一个字符覆盖,而“字符串”在操作中未被修改。
(3) 使用说明
① 由于没有边界检查,编程者要注意保证“字符数组”定义得足够大,以便容纳连接后的目标字符串;否则,会因长度不够而产生问题。
② 连接前两个字符串都有结束标志'\0',连接后“字符数组”中存储的字符串的结束标志'\0'被舍弃,只在目标串的最后保留一个'\0'。
- 3. strlen()函数----字符串有效长度
(1) 调用方式:strlen(字符串);
其中“字符串”可以是串常量,也可以是字符数组。
(2) 函数功能:求字符串(常量或字符数组)的实际长度(不包含结束标志)。
(3) ACM经典代码:统计字符个数
/* 统计个数*/ #include "stdio.h" void main() { char str[100]; int i; int c1=0,c2=0;//c1统计小写字母个数,c2统计大写字母个数 printf("请输入一个字符串:"); gets(str); for(i=0;i<strlen(str);i++) { if(str[i]>='a'&&str[i]<='z') //判断是小写字母 { c1++; } else if(str[i]>='A'&&str[i]<='Z') { c2++; } } //输出统计结果 printf("小写字母:%d个,大写字母:%d个",c1,c2); }
代码接头暗号
/* Note:Your choice is C IDE */ #include "stdio.h" #include "string.h" void main() { //定义三个数组 char ay1[100],ay2[100]; char word[100];//暗语进行连接后的新数组 //输入暗语 printf("请第一个人说暗语:"); gets(ay1); printf("请第二个人说暗语:"); gets(ay2); //组成一句暗语 strcat(strcpy(word,ay1),ay2); //与暗语进行比较 if(strcmp(word,"天王盖地虎宝塔镇河妖")==0) { printf("任务成功\n"); strcpy(ay1,"江南风光好"); strcpy(ay2,"遍地红花开"); printf("第一人的新暗语:"); puts(ay1); printf("第二人的新暗语:"); puts(ay2); } else { printf("任务失败\n"); } }