本次课内容:字符数组和字符串
教学目的:掌握字符串存储方法、字符数组定义方法、初始化方法。
字符串的输入、输出及函数使用方法。
重点:字符串概念、字符二维数组,字符数组定义、初始化和输入
输出处理。
难点:二维数组概念、字符数组处理方法。
预习:二维数组
1、二维数组通过两个下标定义,第一个下标一般表示行,第二个
下标表示列。
2、二维数组可看作是一个一维数组,每个数组元素又是一个一维
数组。
3、二维数组初始化可用一对花括号将一行的数据括起来,也可去
掉每行的花括号,此时将所有数据按数组元素在内存的排列顺序存
放。
4、二维数组元素引用时,一般采用双重循环结构,外循环变量一
般表示行下标,内循环变量一般表示列下标。
5、二维数组一般处理表或矩阵数据。
6、二维数组作为实参时,形参也应是二维数组(目前)
一、字符串和字符串的存储方法
字符串:若干有效字符的序列。
有效字符:字母、数字、专用字符、转义字符等。
字符串是借助于字符型一维数组来存放的。
规定:字符串以字符‘ \0?( ASCII值为 0)作为结束标志。
’ \0?作为标志占用存储空间,但不计入串的实际长度。
C语言中无字符串类型,但允许使用“字符串常量”。在表示
字符串常量时,不需要人为在其末尾加入‘ 0?,编译程序自动加入。
如:,Hello” 不必写成, Hello\0”
字符串数组的定义,
char 数组名 [常量表达式 ];
如,char ch[10];
可以存放 10个字符,其中包括‘ \0?。
二、字符串数组的初始化
1、逐元素赋初值
如,char ch[10]={?H?,?e?,?l?,?l?,?o?,?\0?};
H e l l o \0 \0 \0 \0 \0
又如,char ch[10]={?H?,?e?,?l?,?l?,?o?};
此例虽未加‘ \0?,但由于所赋字符数不足,则自动用‘ \0?补充。
又如,char ch[5]={?H?,?e?,?l?,?l?,?o?};
此时数组不能作为字符串,按各元素字符处理(结尾无‘ \0?)。
2、指定一个字符串初值
如,char c[ ]={“Hello”};
C编译程序自动加上‘ \0?。
三、字符串的输入
1、输入一个字符
如, char str[5];
scanf(“%c”,&str[0]);
2、输入一个字符串
如,scanf(“%s”,str);
注:引用数组名时不加 &,输入时不加引号,编译程序自动加‘ \0?。
系统以空格或回车来作为字符串的间隔符。
H e l l o \0 \0 \0 \0 \0
H e l l o
3、用 gets( )函数输入字符串
如,char str[ 9 ];
gets(str);
此函数对输入的字符(包括空格)全部读入,直到遇到加车
符为止。
如:输入字符串为,computer & C
四、字符串的输出
1、输出单个字符
如,printf(“%c”,str[0]); 指出数组的具体元素,格式符 %C
2、输出字符串
如,printf(“%s”,str); 使用数组名,格式符 %S
注:字符串中尾部的‘ \0?不作为输出内容。
3、用 puts( )函数输出字符串
如,char str[ 9 ];
gets( str );
puts(str);
注,puts( )函数输出时将‘ \0?作为换行符,即每次输入一行。
五、字符串运算函数
1、字符串拷贝函数
格式,strcpy(字符数组名,字符串表达式)
如, strcpy( str,“china”);
注, (1)复制时,连同‘ \0?一起复制到字符数组中;
(2)字符串表达式可以是字符数组名 ;
char str1[81],str2[ ]={“computer”};
strcpy( str1,str2);
printf(“%s\n”,str1);
结果为,computer
(3)对字符数组不能用,=”直接赋值;
如,char str1[81];
str=“china”; 是错误的
2、字符串联接函数
格式,strcat( str1,str2);
功能:将 str2联接到 str1的后面,最后加一个‘ \0?,结果 放在 str1
中。
如,P169_例 5.8 图 5.25
3、字符串比较函数
格式,strcmp(字符串 1,字符串 2)
功能,
字符串 1>字符串 2 返回值:正整数
字符串 1=字符串 2 返回值,0
字符串 1<字符串 2 返回值:负整数
比较方法:两字符串对应按 ASCII值进行比较。
4、测字符串长度函数
格式,strlen( 字符表达式);
功能:得到字符表达式‘ \0?之前的全部字符个数。
如,char str1[10];
gets(str1);
printf(“%d”,strlen(str1));
输入字符串为,asdf
结果为,4
六、二维字符数组
1、二维数组
由若干个一维数组组成。
如,static char str[3][6]={“aaaaa”,“bbbbb”,“ccccc”};
2、二维数组数据输出
static char str[3][6]={“aaaaa”,“bbbbb”,“ccccc”};
printf(“%c”,str[1][1]); /*元素,单字符 */
printf(“%s”,str[0]); /*一维数组,字符串 */
注:当输出的串无‘ \0?标志时,则继续取下一个字符,直到遇
到’ \0?结束。
七、举例
P175_5.14(1)
#include,stdio.h”
#include,strint.h”
main()
{
void strlwr(char s[ ],int n);
char str[81];
gets(str);
strlwr(str,strlen(str));
printf(“%s\n”,str);
}
void strlwr(char ch[ ],n)
{
int k;
for ( k=1 ;k<n;k++)
ch[k]=ch[k]+32;
}
小结,
1、字符串及字符串存储方法
2、字符数组的初始化
3、字符串的输入
4、字符串的输出
5、字符串函数
6、字符二维数组
实验准备
教学目的:掌握字符串存储方法、字符数组定义方法、初始化方法。
字符串的输入、输出及函数使用方法。
重点:字符串概念、字符二维数组,字符数组定义、初始化和输入
输出处理。
难点:二维数组概念、字符数组处理方法。
预习:二维数组
1、二维数组通过两个下标定义,第一个下标一般表示行,第二个
下标表示列。
2、二维数组可看作是一个一维数组,每个数组元素又是一个一维
数组。
3、二维数组初始化可用一对花括号将一行的数据括起来,也可去
掉每行的花括号,此时将所有数据按数组元素在内存的排列顺序存
放。
4、二维数组元素引用时,一般采用双重循环结构,外循环变量一
般表示行下标,内循环变量一般表示列下标。
5、二维数组一般处理表或矩阵数据。
6、二维数组作为实参时,形参也应是二维数组(目前)
一、字符串和字符串的存储方法
字符串:若干有效字符的序列。
有效字符:字母、数字、专用字符、转义字符等。
字符串是借助于字符型一维数组来存放的。
规定:字符串以字符‘ \0?( ASCII值为 0)作为结束标志。
’ \0?作为标志占用存储空间,但不计入串的实际长度。
C语言中无字符串类型,但允许使用“字符串常量”。在表示
字符串常量时,不需要人为在其末尾加入‘ 0?,编译程序自动加入。
如:,Hello” 不必写成, Hello\0”
字符串数组的定义,
char 数组名 [常量表达式 ];
如,char ch[10];
可以存放 10个字符,其中包括‘ \0?。
二、字符串数组的初始化
1、逐元素赋初值
如,char ch[10]={?H?,?e?,?l?,?l?,?o?,?\0?};
H e l l o \0 \0 \0 \0 \0
又如,char ch[10]={?H?,?e?,?l?,?l?,?o?};
此例虽未加‘ \0?,但由于所赋字符数不足,则自动用‘ \0?补充。
又如,char ch[5]={?H?,?e?,?l?,?l?,?o?};
此时数组不能作为字符串,按各元素字符处理(结尾无‘ \0?)。
2、指定一个字符串初值
如,char c[ ]={“Hello”};
C编译程序自动加上‘ \0?。
三、字符串的输入
1、输入一个字符
如, char str[5];
scanf(“%c”,&str[0]);
2、输入一个字符串
如,scanf(“%s”,str);
注:引用数组名时不加 &,输入时不加引号,编译程序自动加‘ \0?。
系统以空格或回车来作为字符串的间隔符。
H e l l o \0 \0 \0 \0 \0
H e l l o
3、用 gets( )函数输入字符串
如,char str[ 9 ];
gets(str);
此函数对输入的字符(包括空格)全部读入,直到遇到加车
符为止。
如:输入字符串为,computer & C
四、字符串的输出
1、输出单个字符
如,printf(“%c”,str[0]); 指出数组的具体元素,格式符 %C
2、输出字符串
如,printf(“%s”,str); 使用数组名,格式符 %S
注:字符串中尾部的‘ \0?不作为输出内容。
3、用 puts( )函数输出字符串
如,char str[ 9 ];
gets( str );
puts(str);
注,puts( )函数输出时将‘ \0?作为换行符,即每次输入一行。
五、字符串运算函数
1、字符串拷贝函数
格式,strcpy(字符数组名,字符串表达式)
如, strcpy( str,“china”);
注, (1)复制时,连同‘ \0?一起复制到字符数组中;
(2)字符串表达式可以是字符数组名 ;
char str1[81],str2[ ]={“computer”};
strcpy( str1,str2);
printf(“%s\n”,str1);
结果为,computer
(3)对字符数组不能用,=”直接赋值;
如,char str1[81];
str=“china”; 是错误的
2、字符串联接函数
格式,strcat( str1,str2);
功能:将 str2联接到 str1的后面,最后加一个‘ \0?,结果 放在 str1
中。
如,P169_例 5.8 图 5.25
3、字符串比较函数
格式,strcmp(字符串 1,字符串 2)
功能,
字符串 1>字符串 2 返回值:正整数
字符串 1=字符串 2 返回值,0
字符串 1<字符串 2 返回值:负整数
比较方法:两字符串对应按 ASCII值进行比较。
4、测字符串长度函数
格式,strlen( 字符表达式);
功能:得到字符表达式‘ \0?之前的全部字符个数。
如,char str1[10];
gets(str1);
printf(“%d”,strlen(str1));
输入字符串为,asdf
结果为,4
六、二维字符数组
1、二维数组
由若干个一维数组组成。
如,static char str[3][6]={“aaaaa”,“bbbbb”,“ccccc”};
2、二维数组数据输出
static char str[3][6]={“aaaaa”,“bbbbb”,“ccccc”};
printf(“%c”,str[1][1]); /*元素,单字符 */
printf(“%s”,str[0]); /*一维数组,字符串 */
注:当输出的串无‘ \0?标志时,则继续取下一个字符,直到遇
到’ \0?结束。
七、举例
P175_5.14(1)
#include,stdio.h”
#include,strint.h”
main()
{
void strlwr(char s[ ],int n);
char str[81];
gets(str);
strlwr(str,strlen(str));
printf(“%s\n”,str);
}
void strlwr(char ch[ ],n)
{
int k;
for ( k=1 ;k<n;k++)
ch[k]=ch[k]+32;
}
小结,
1、字符串及字符串存储方法
2、字符数组的初始化
3、字符串的输入
4、字符串的输出
5、字符串函数
6、字符二维数组
实验准备