即:x=c[2] x的值为“c” 4.字符串的使用
C语言中,将字符串作为字符串来处理。
规定:一个“字符串结束标志”,以字符‘\\0’,在遇到字符‘\\0’时,表示字符串结束。
1)使用字符串常量进行数组初始化 static char c[ ]={“I am happy”}。 或 static char c[ ]=“I am happy”。
等价于 static char c[ ]={‘I’, ‘ ‘, ‘a’, ‘m’, ‘h’, ‘a’, ‘p’, ‘p’, ‘y’,’\\0’}。 注:(a)系统对字符串常量自动加一个‘\\0’ (b)字符数组并不要求它的最后一个字符为‘\\0’ 2)数组长度始终保证大于字符串实际长度
static char c[10]={“ABCDE”}。 (第5个元素\\0,第6个开始为空字符ASCⅡ为0)
static char c[10]={‘A’, ‘B’, ‘C’, ‘D’, ‘E’}。 (后面5个元素为空字符ASCⅡ为0)
例7-6 P131:字符数组引用 例子 打印图形 (J5_1.C)
#define NL printf(\ main()
{ char a[10]={'*','*','*','*','*','*','*','*','*','*'}。 int i,j。 图案层数 for (i=0。i<=4。i++) { NL。 图案前空格 for (j=1。j<=i。j++) printf(\。
for (j=1。j<=10-(2*i-1)。j++) printf(\。 } * 个数 }
*********
******* ***** *** *
5.字符数组的输入输出 1)两种方法:
a)逐个字符输入输出。 用格式符“%c”进行 scanf ( “%c”, &c[i])。 b)整个字符串一次输入输出。用格式符“%s”进行
例: static char c[ ]={“abcde”}。
printf(“ %s” , c ) 。 (为数组名,不能为“ %s” , c[0]) 2)可以用scanf 函数输入一个字符串 static char c[6]。
scanf ( “%s”, c )。
注意:键盘输入不能超过5个字符
c不用加地址符&,即&c;因数组名代表数组的起始地址 6.字符串处理函数
在C的函数库中提供了一些用来处理字符串的函数 (1)scanf 和printf函数在字符串的使用
使用scanf和printf函数对字符串的处理时,调用语句中的输入或输出项使用的是字符数组名。(即使用字符数组名的首地址) 例:main ( ) (j5_9.c) { char s1[3] , s2[5]。 scanf(“%s%s”,s1 , s2 )。 printf(%s\\n%s\\n”, s1 , s2 )。 } 输入:
ABC DEF HK (即:希望s1=“ABC ”s2=“DEF HK” 输出: ABC DEF
说明:C语言规定,scanf函数遇空格或回车就结束本次输入。 (2)puts函数
格式:puts(字符数组) 即: puts(str)
将一个字符串str(以‘\\0’结束的字符序列)输出到终端 (3)gets 函数
格式:gets(字符数组) 即: gets ( str ) 输入:abcde
读取字符串并把它们依次放到str指向的字符数组中去。 得到一个函数值,该函数值是字符数组的起始地址。
str是字符数组的首地址,它读取字符串直到遇到换行符或EOF。
换行符或EOF不进入字符串,被转换为“\\0”,作为字符串结束符 (4)strcat函数
strcat( str1 , str2 )。str1,str2是字符数组
连接两个字符数组中的字符串,把str2接到str1的后面,结果放在字
符数组str1中。
例:static char str1[20]={“ABCD EF”} static char str2[ ]={“gggg”}
执行strcat(str1,str2)的结果为:ABCD EFgggg 书P136 (5)strcpy函数
strcpy( str1 , str2 )。功能:把str2的内容复制到str1中 例:strcpy( str1 , “abcd” )。
strcpy( &a[n] , &a[n+1] )。 作用:将n个字符以后的字符顺序地向前移动一个序号。
说明:a ) str1>=str2
b ) str1必须是数组名,str2可以是数组名或字符串常量 c ) 可以解决字符串常量不能赋值给字符数组
即:str1={“abcde”} 。 str1=str2。(不合法) 可用strcpy(str1,str2) 注:strcpy(str1,str2,2); 是将str2中前面2个字符拷贝到str1中去,然后再加一个‘\\0’。 (6)strcmp函数 strcmp( str1 , str2 )。
功能:把str1与str2的内容进行比较(按ASCII码的大小进行比较) 如果:str1=str2,则函数返回0
如果:str1>str2,则函数返回正整数 如果:str1 strlen( str )测试字符串长度,不包括‘\\0’ (8)strlwr函数 strlwr ( str )将字符串中大写字母换成小写字母 (9)strupr函数 strupr ( str )将字符串中小写字母换成大写字母 7.程序举例:书P138 例7.8 例7.9 五、该章的主要例题:例7.1、例7.2、例7.3、例7.4、例7.5、例7.6、例7.8、例7.9 六、主要习题:7.1、*7.2、7.3、7.5、7.6、*7.9、7.11、*7.13 七、主要上机内容:例7.2、例7.3、例7.4、例7.5、例7.7、例7.8、7.1、7.3、*7.9、7.11 其他:上机实验指导书中内容 第八章 函数与程序结构 1、函数的一般概念:函数形参、实参、返回值,函数的类型; 2、动态存储变量与静态存储变量 3、变量的生存期与作用域 重点:①函数的定义和调用及使用函数的特点。 ②函数间的参数传递(值传递和地址传递)。 ③变量存储作用域、编译预处理的使用。 难点:①函数参数传递(数值、地址)及形参、实参的使用; ②变量存储作用域及自动变量与静态变量的区别。 一、函数概述 一个较大的程序:可由若干程序模块组成,每一模块用来实现一个特定的功能。 ——用子程序可实现该模块功能。 ——在C语言中:子程序称为:子函数 在C程序中: 可由一个主函数和若干个函数构成。 分为标准库函数和用户自定义函数 函数的作用: 减少重复编写程序段的工作量。 语句 语句 功能 调用 功能 语句 语句 功能 调用 语句 语句 标准库函数:由C语言预先编写的一系列常用函数(系统提供) Turbo C 的标准库——包含400多个常用函数 用户自定义函数: 一般自定义函数和自定义函数库(用户先已编好的) 二、函数定义(子函数的设计) 1.函数定义 格式:类型定义符函数名(形式参数表列) { 函数体 } 说明:1)类型定义符:函数返回值的数据类型 a) int , char , float , double 默认int b) 函数无数据返回,使用 void 作类型定义符 2)函数名:函数的名称(用户取的:合法的标识符) 3)形式参数表列:函数调用时传递信息的通道 有两种表示方法: a)(参数说明 形式参数) 传统风格 b) (形式参数) 参数说明 例: float add( float x , float y ) float add( x , y ) { x=x+y。 { float x , y 。 return (x) 。 x=x+y 。 } return (x)。 } a). b) 2.函数的返回值 ? 一般通过函数中的return语句获得。 ? 如果不需要返回值,可以不要return语句。 为了明确表示“不带回值”,可以用“void”定义“无类型” 例: main ( ) /*(打印平方表)*/ { void prin ( int x ) 。 int i 。 for ( i=1 。 i<=10 。 i++) prin ( i ) 。 } void prin ( x ) int x 。 { printf(“%d\\t%d\\n”,x,x*x)。 } 三、函数间的参数传递 在一个主调函数调用一个子函数时,须把主调函数的参数传递给子函数,称该参数为“实际参数”。 实参可以是常量、变量、表达式 实参应和形参类型相同或相容 P146 例8.2 (主函数) c=max(a , b)。 (子函数) max(int x , int y) 参数传递形式参数 实际参数 (1)数值传递方式 特点:实参通过复制的方式传递给形参(占用不同的内存空间) 实参地址2形参地址 a x 调用函数的实参:给出具体数据 (2)地址传递方式 特点:参数传递不是数据本身,而是数据的地址(使用同一地址空