第 1 章 C 语言程序的基本形式
1.1 C 语言的结构
C 语言程序都是由一个或多个函数(Function)构成。一个 C 程序至少必须存在一个函数 “main()”。它是程序运行开始时调用的一个函数。它表明该程序完成动作轮廓。C 语言程序 的基本形式如下:
void main()
{
变量说明语句;
执行语句;
}
main()为主函数,只能有一个。执行语句中,可有其他函数,但不能用 main 为函数名。 许多常用的函数做成标准函数与 C 编译器一起提供给用户,这就是标准库函数。
例 1.1:C 语言程序
/* This program is sum of two integer and the results */
void main()
{
int a,b,sum;
a=123;
b=456;
sum=a+b;
printf(“The sum of %d and %d is %d\n”,a,b,sum);
}
此例中,只有一个函数——主函数 main()。第一个语句是说明 a,b 和 sum 这些变量的 语句,说明它们都是整数(int)型的变量。所有语句都放在左右花括号之内,各语句之间以分 号“;”结束。
1.2 标识符
C 语言中所使用的每个函数和变量都应有唯一的名称,这样才能被识别和使用。通常, 这种函数和变量名称用一串字符表达,称为标识符。C 语言使用的标识符有严格限制:
(1) 必须以字母或下划线开头, ;
(2) 必须由字母,数字或下划线组成;
(3) 大小写字母是有区别的;
(4) 不允许用一些保留字(或叫关键字)。
例: 正确的函数或变量名:
_abc, veb7, lev_5
错误的函数或变量名称的实例:
3H, sUM$,char
1.3 保留字(即关键字)****
在 C 语言中保留字或关键字并不太多,原先规定有 28 个,新标准规定改为 32 个,如
下所示:
auto default extern long static void break do for
register struct volatile case double float return switch
while char enum goto sizeof typedef continue else if
signed union int short unsigned
1.4 基本数据类型
?
C 语言可以使用多种数据类型 (1)基本类型
·整数类型 int ·实数类型(浮点类型): 单精度浮点型 float 双精度浮点型 double ·字符类型 char ·枚举类型 enum
(2)构造类型
·数组类型 [] ·结构类型 struct ·联合类型 union
(3)指针类型&, *
(4)空类型 void
1. 整数型(即 integer——int 型)
整数型常量不仅可以用十进制表示,也允许用八进制或十六进制表示,例如:
62 十进制数
053 八进制数 以 **0** 打头,由 0~7 构成。
0x32 十六进制数 以 **0x** 打头,由 0~9 和 A~F 构成。
如 0x2C2 即(2×16+12)×16+5=709
整数类型又可细分成不同长短的类型,应加上类型修饰符构成,即:
short int 可简化为 short
long int 可简化为 long
unsigned int 可简化为 unsigned
2.浮点类型(即 float 型)****
实数类型也叫浮点类型。可包含有整数部分和小数部分,例如:
0.012 等同于.012 (省略0)
5.0 等同于 5. (省略0)
科学计数法中,则用“尾数+e+指数”表示浮点数值,e 即 exponent(指数)例如:
6.3e5 等同于 630000.0 6.3x10^5
其中,6.3 就是尾数,含有整数部分(integer part)为 6 和小数部分(fractional part)为 3, 而 5 就是指数 (exponent) 部分。尾数和指数也都有可能为负值,例如:
-1.23e4 -1.23x10^4
12.34567e-8 12.34567x10^(-8)
-78e-12 -78x10^(-12)
3.字符类型(char 型)
字符类型的数据代表一个字符,由一对单引号将字符括起来,表示的是该字符在 ASCII 码表中的代码 值,例如:
‘a’ 即 97
‘A’ 即 65
它们占 1 byte。
ASCII 码表中的某些控制字符不可显示,则通过加反斜线“\”的转义字符表示,例如:
‘\0’ 表示 NULL(空) 即 0
‘\t’ 表示 tab(制表) 即 9
‘\n’ 表示 new line(新行或换行) 即 10
‘\r’ 表示 return(回车) 即 13
‘\\’ 表示反斜线\ 即 92
例 1.2:ASCII 码值。
void main ( ) {
char c1, c2; /*定义字符类型*/
c1=97; c2=98; /*赋整型值*/
printf("%c # %c\n", c1,c2);/*以字符类型输出*/
}
例 1.3: 小写转大写
void main ( ) {
char c1, c2; c1='a'; c2='b'; /*定义字符类型*/
c1=c1-32; c2=c2-32; /*整型数值运算*/
printf("%c %c", c1, c2);
}
1.5 算术表达式
1. C 语言中算术运算符
算术表示达式由变量、常量及算术运算符构成。在 C 语言中算术运算符有:
+、 -、 *、 /、 % 、-- 、++
+,-,*,和/为四则运算符,和日常概念没有区别,其中 * 和/优先于+和-。 %为取模(Modulus)运算符,是针对整数运算,即取整数除法之后,所得到的余数,例如:
10%3=1 即 10 对 3 取模,结果为 1。
13%8=5 即 13 对 8 取模,结果为 5。
--为自减 1,++为自增 1。
n++或++n 都变量 n 自增 1,最终结果与 n=n+1 等效。但处理过程却有所区别。 ++n,表示 n 先自增 1,然后进到具体的式子中运算;n++,则 n 本身先进入式中运算, 最后 n 再增 1。
例如:已知 n=6,则
m=++n;结果为:m=7,n=7
m=n++;结果为:m=6,n=7
n--与--n 同样类似。
****2.数据类型与运算结果的关系
(1) 同类型数据运算结果仍保持原数据类型 整型数的除法得到的结果仍是整型数,小数部分将被去掉,例如:
5/2=2
而不是 2.5。浮点数的除法得到的仍是浮点数,例如:
5.0/2.0=2.5
(2) 不同数据类型混合运算,精度低的类型往精度高的类型转换后,再做运算。例如:
5.0/2=2.5
1.6 C 语言的基本语句
1. C 语言的特点
(1) 所有 C 语句都以“;”分号结尾。一条语句可以不止一行,不必加续行符,只根据“;” 来确定语句结束。两条或多条语句也可写在同一行,用“;”分开。
(2) 语句可从任一列位置开始,每行开头,有多少空格都可以,但为了可读性好,通常习惯还是按一定规律缩进。
2. 变量说明语句
变量说明语句的主要作用就是定义变量类型,其格式是:
类型说明符 变量 1,变量 2,…;例如:
int number;
char a,b,c;
float t1;
3. 赋值语句
赋值语句是将常量或算术表达式的运算结果赋给变量,其格式是:
变量名=常量或算术表达式; 例如:
int number;
number=10;
例 1.4: 赋值操作
void main()
{
int n1,n2,n3;
int total;
n1=1;
n2=2;
n3=3;
total=n1+n2+n3;/* 赋值操作*/
}
4.基本输入输出语句
printf()和 scanf()是 C 语言的基本输入输出函数,都放在标准函数库中,为了使用它们, 应在程序开头加上:
基本输入输出语句就是直接调用这两个基本输入输出函数。 (1)输出语句
一般格式是:
printf (“控制串”,表达式 1,…,表达式 n);
控制串(或格式串)是用双引号括起来的输出格式控制说明。控制串中每一个变量都应当 与后面相应的某个表达式对应。
控制串分两部分,即:要显示的字符和格式串。格式串以“%”开头,后跟格式码。格式串与参数一 一对应。含有不同格式码的格式串表示显示不同的内容,如下所示:
%c 显示字符
%s 显示字符串
%d 以十进制格式显示整数
%o 以八进制格式显示整数
%x 以十六进制格式显示整数
%u 显示无符号整数
%f 显示浮点数
%e 以科学计数法显示数字
格式码前可加修改量以便更好地控制显示格式,主要有:
·字符宽度控制,例如:
%4d 显示十进制整数,至少给 4 个数字位置
%10s 显示字符串,至少给 10 个字符位置
·精度控制,例如:
%10.4f 显示浮点数,共占 10 位,小数点后取 4 位
%5.7s 显示字符串,最少占 5 位,最多占 7 位
·L 或 h
%Ld 显示十进制长整数
%hd 显示十进制短整数
%Lf 显示双精度浮点数
·显示位置默认为右对齐,若加负号(即“-”),则为左对齐,例如:
%d 右对齐显示十进制整数
%—d 左对齐显示十进制整数
例如:
prinft(“Welcome!”);
屏幕上显示结果:
Welcome!
例如:
prinft(“Welcome\n”);
与前例不同是后面加了一个换行符。
例如:
int number=10;
printf(“The number is %d\n”,number);
应显示:
The number is 10
例如:
float valuel,value2,value3;
value1=2.3;
value2=4.5;
value3=6.7;
printf(“The average of %of and %f and %f is %f\n”,value1,value2,value3,(value1+value2+value3)/3.0);
应显示:
The average of 2.3 and 4.5 and 6.7 is 4.5
%d 和%f 表示在相应的位置显示的数据类型,且一一对应。%d 表示要显示整型数,%f 表示要显示浮点型数。
(2)输入语句
一般格式是:
scanf(控制串,地址表达式 1,地址表达式 2,……,地址表达式 n);
控制串(或叫格式串)与前述 printf()中的控制串类似,也包含有以“%”开头加格式码组 成的格式串。控制串是用双引号括起来的输入格式控制说明。地址表达式所列出的应当是变量的地址,而不是变量名。每个地址表达式的值,对应于前面控制串中某一格式变量的地址。
如:
int number;
scanf(“%d”,&number);
其中,%d 表示应以整型格式输入,&number 表示指向 number 的地址。
注意:
控制串中的非空白符,例如:
scanf(“%d,%d”,&i,&j) ;
上式中“%d”之间有逗号,输入时也应加逗号。还可用修改控制域宽,例如:
%20s 就只取前 20 个字符
%s 取全串
例如 :
float average;
scanf(“%f”,&average);
其中,%f 表示应以浮点型格式输入,&average 表示指向 average 的地址。
第 2 章 流程控制
2.1 控制表达式
程序的流程走向是由条件表达式的值控制决定的。表达式总是有值的。
1.逻辑表达式
逻辑表达式由变量、常量和逻辑关系运算符构成,用以表示变量的逻辑关系。
(1) 逻辑与 (AND) &&
(2) 逻辑或 (OR) ||
(3) 逻辑非 (NOT) !
逻辑表达式只有两种可能的取值,真假必取其一。假者取值为 0;真者取值为 1。
2.关系运算符
变量与变量或常量之间比较数值上大小的关系用关系运算符来表示。关系运算符共有六 种,即:
== 等于
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
关系表达式也只有两种可能的取值,例如:
‘a’==’b’
此式取值 0,值为假(false)。 又如,已知变量 x=’c’,则表表达式
x>’b’
值为真(true),取值 1。
3. 运算操作符的结合性和优先级
运算操作符的结合性和优先级规定了表达式运算操作的处理顺序。优先级高的操作应优先执行。
例如,处理表达式
a+b*c 时,*优先于+,相当于 a+(b*c)。
有部分运算操作符的结合性是从右向左。最常见的赋值表达式中,赋值运算操作符的结
合性就是自右向左。例如,
a=b+c 是将 b+c 结果赋给 a
又如:
a*=b+c 相当于 a=a*(b+c)。
单操作数的运算操作符++(自增 1),++(自减 1),-(负号)的结合性也都从右向左。
例如,
-i++相当于-(i++),而不是(-i)++
关于运算符的优先级低于算术运算符,例如:
a<b+c 等同于 a<(b+c)
2.2 for 循环语句
1. for 循环语句的一般格式为:
for(初始化表达式;循环条件;循环表达式)
循环体语句块
例 2.1:在屏幕上,显示 1~100
void main()
{
int n;
for (n=1;n<=100;n++)
printf(“%d\n”,n); /*循环体语句*/
}
for 语句中“;”隔开的各部分:
(1)初始化表达式,用于循环开始前,为循环变量设置初始值。
(2)循环条件是一个逻辑表达式,若该式取值为真即条件满足,则继续执行循环;否则,执行循环体后的语句。
(3)循环表达式定义了每次循环时,循环变量的变化情况。
(4)循环体可以是一条语句或一组语句,若是一组语句,需要用“{”和“}”括起来。
2. for 语句执行过程
(1)计算初始表达式。
(2)判断循环条件,若满足,则执行;否则,退出循环。
(3)执行循环。
(4)返回第(2)步。
例 2.2:显示十的阶乘 10!
#include <stdio.h>
void main()
{
int n,result;
result=1;
for(n=1;n<=10;n++) {
result*=n
printf(“%d!=%d\n”,n,result);
}
}
例 2.3:打印可印刷字符的 ASCII(从 32 到 126)代码字符对照表。
main () {
int i;
for (i=32;i<127; i++) { /* 从 ASCII 码为 32 的开始 */
printf("%4d %c",i,i); /* 打印 ASCII 码及其对应的字符 */
if ((i+4)%5 == 0) printf ("\n"); /* 每行打印 5 个字符后换行 */
}
}
3.嵌套的 for 语句
在 for 的循环体中还包含 for 语句,这就是嵌套的 for 语句。 例 2.4:计算五个给定数的阶乘
#include <stdio.h>
void main()
{
int i,j,number,result;
for(i=1;i<=5;i++) {
scanf(“%d”,&number);
result=1;
for(j=1;j<=number;j++)
result *=j; /*内循环体语句*/
printf(“%d!=%d\n”,number,result);
} /*外循环体语句*/
}
2.3 while 语句
按某一条件循环,可以不知道循环的次数,直到不满足该条件时,才停止循环。
1.while 语句的一般格式为:
while(循环条件)
循环体语句块
例 2.5:显示 1~100
#include <stdio.h>
void main()
{
int n;
n=1;
while(n<=100){
printf(“n=%d”,n);
n++;
}
}
2.while 语句的执行过程
(1) 判断循环条件是否满足,不满足就退出循环体。
(2) 执行循环体。
(3) 返回第(1)步。
如果循环条件根本不能成立,则永不执行循环体;反之,若循环条件总是成立,则成为 永久循环(死循环)。
例 2.6:倒排输出数字
void main()
{
int number,rdigit;
scanf(“%d”,&number);
while(number!=0){
rdigit=number%10; /*取出低位数*/
printf(“%d”,rdigit);
number/=10;
} printf(“\n”); /*循环跳出后换行*/
}
输入的数若为 12345 则输出 54321。
例如:利用 while 语句和空语句跳过所有的空白字符
while(c=getchar())==’’);
例如:永久循环
while(1){
…
}
2.4 Do- while 语句
Do- while 语句为当型循环结构,执行时先执行循环体语句再判断循环条件。
1.do- while 语句的一般格式为:
do
循环体语句块
while(循环条件);
例 2.7:倒排数字输出
void main()
{
int number,rdigit;
printf(“Please input a number:”);
scanf(“%d”,&number);
do{
rdigit=number%10;
printf(“%d”,rdigit);
numbe/=10;
}while(number!=0);
}
2. 执行过程
(1) 执行一次循环体。
(2) 判断是否满足循环条件,若满足,则循环,转到(1)继续执行;否则,执行随后的语句。
2.5 if 语 句
1.简单的 if 语句
简单的 if 语句格式为:
if(条件表达式)
语句块
只要条件表达式满足逻辑关系,即表达式的值为真,就执行语句块。 例 2.8:比较两个数
void main()
{
int m,n;
printf(“Please input two numbers\n”);
scanf(“%d %d”,&m,&n);
if(m>n)
printf(“The first number is bigger\n”);
}
2.复合句的 if 语句
复合的 if 语句格式为:
if(逻辑表达式)
语句块 1
else
语句块 2
若满足逻辑关系,即逻辑表达式的值为真,则执行语句块 1;否则,执行语句块 2。
例 2.9:比较两个数的改进
int main()
{
int m,n;
printf(“Please input two numbers\n”);
scanf(“%d %d”,&m,&n);
if(m>n)
printf(“The first number is bigger\n”);
else /* 相当于 m<n */
printf(“The first number is bigger\n”);
}
?
例 2.10:检查闰年
/* This program determines if a year is a leap yaer */
main() {
int x;
printf(“Please input two numbers\n”);
scanf(“%d”,&x);
if(x%4==0&&x%100!=0||x%400==0)
printf(“%d is a leap year\n”,x);
else /* 不满足上述条件 */
printf(“%d is not a leap year\n”,x);
}
可见,这种复合的 if 语句是等同于两个简单的 if 语句,即:
if(逻辑表达式)
语句块 1
if(逻辑表达式)
语句块 2
3.嵌套的 if 语句
在 if 语句的语句块中还可包含 if 语句,这就形成嵌套的 if 语句。其格式为:
if(逻辑表达式 1)
语句块 1
else if(逻辑表达式 2)
语句块 2
else
语句块 3
例 2.11:
-1 (x<0)
有一个函数 y= 0 (x=0)
1 (x>0)
void main ( ) {
int x,y;
scanf ("%d",&x);
if (x<0)
y=-1;
else if (x==0)
y=0;
else
y=1;
printf ("x=%d,y=%d\n",x,y);
}
此例 if 与 else 是成对的,比较容易理解。 实际上也可能在嵌套中只有 if,而没 有 else, 这样就容易造成错误。因为 else 总是与前面最相近的一个不包含 else 的 if 语句对应匹配, 为避免发生这种错误,应将嵌套中的 if 语句用“{”和“}”括起来,即:
if(逻辑表达式 1){
if(逻辑表达式 2)
语句块 1 }
else
语句块 2
4. else-if 语句
实际上,这也是一种嵌套,在 else 下再嵌套 if_else,形成如下格式:
if(逻辑表达式 1)
语句块 1
else if(逻辑表达式 2)
语句块 2
else if(逻辑表达式 3)
语句块 3
…
else
语句块 n
例 2.12:用 else-if 语句,写一个程序,输入一个数 x,打印出符号函数 sign(x)的值。
-1 x<0
符号函数为 sign(x)= 0 x=0
1 x>0
void main() {
int number,sign;
printf(“Please type in a number x=”);
scanf(“%d”,&number);
if(number<0)
sign=-1;
else if(number==0) /*else 包括=0 和>0 两者*/
sign=0;
else
sign=1;
printf(“sign(x)=%d\n”,sign);
}
2.6 条件表达式运算符
条件表达式运算符的一般格式为:
条件 ? 表达式 1:表达式 2
这是一个三元运算符,它控制三个操作数,第一个操作数是条件,条件通常是一个逻辑关系表达式。该条件若为真,取表达式 1 的值,就是整个条件表达式的运算结果;否则,取表达式 2 的值作为整个条件表达式的运算结果。
例 2.13:求最大值.
main()
{
int a,b,c;
scanf(“%d %d”,&a,&b);
c=(a>b)?a:b;
/* 取 a 和 b 中大者赋给 c */
printf(“The maxum is %d”,c);
}
2.7 break 语句
break 语句用在 for,while,do 以及 switch 语句中。当执行一个循环体时,在某一特定状态出现 break 语句时,立即退出循环体,且只退出本级循环。
例 2.14:九九乘法表
main()
{
int i,j;
for(i=1;i<=9;i++){
for(j=1;j<=9;j++){
if(j>i)break; /* 被乘数大于乘数时跳出内循环 */
printf("%d ",i*j);
}
printf("\n");
}
}
其结果将打出三角形的乘法表,即
1
2 4
3 6 9
4 8 12 16
5 10 15 20 25
6 12 18 24 30 36
7 14 21 28 35 42 49
8 16 24 32 40 48 56 64
9 18 27 36 45 54 63 72 81
2.8 continue 语句
continue 语句执行后,在本次循环中其他语句均不执行,转而继续执行循环体的下一次循环。在 while﹑do 循环中意味着立即转入条件测试,在 for 循环中意味着立即转到执行 i++,而进入下一次重复。 例 2.15:只做正数的累加而跳过负数
main()
{
int a,i,n,sum;
scanf(“%d”,&n);
sum=0;
for(i=0;i<n;i++){
scanf(“%d”,&a);
if(a<0)
continue;
sum+=a;
}
printf(“The sum=%d\n”,sum);
}
2.9 switch 语句
switch 语句的一般格式为:
switch(表达式) {
case 常量 1:
语句块 1
break;
case 常量 2:
语句块 2
break;
…
case 常量 n:
语句块 n
break;
default:
语句块 n+1
break;
}
它是根据表达式为不同的值而执行不同的语句块,可以看成是特殊的 else_if 语句。即:
if(表达式==常量 1)
语句块 1
else if(表达式==常量 2)
语句块 2
…
else if(表达式==常量 n)
语句块 n
else
语句块 n+1
但用 switch 语句则更方便,实际上也用得更多一些。
第 3 章 数组与字符串
3.1 一维数组
1.数组及其特点
实际处理的数据,往往不仅是一个,而是量大但性质相同的数据。例如,一个班的学生 成绩等等。它们是相同性质的数据。如果仍一个个加以说明,麻烦易错。改用数组,这就方 便多了。例如:
int grade[n];
数组是相关变量的有序集合,其中所有的变量具有相同的数据类型。数组的特点:
(1) 各元素是同一种类型的变量。
(2) 各元素按顺序排列,其位置由下标来确定。
(3) 各元素可独立地作为一个基本变量被赋值和使用。
2.一维数组说明和下标
(1) 一维数组说明格式为:
类型说明符 数组名[size]
其中,size 为数组的大小,即组成该数组元素的个数。
(2) 数组的下标
C 语言中,数组的下标从 0 开始,到 size-1 为止。
例如: int x[5]
就有下标从 0 到 4 共 5 个元素,即:x[0],x[1],…,x[4]。
例 3.1:产生斐波那契(Fibonacci)数列前 16 项
void main()
{
int Fibonacci[16],i;
Fibonacci[0]=0;
Fibonacci[1]=1;
for(i=2;i<16;i++)
Fibonacci[i]=Fibonacci[i-2]+Fibonacci[i-1];
for(i=0;i<16;i++)
printf(“%d,”,Fibonacci[i]); printf(“…\n”);
}
执行结果:
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,510,…
3.2 多维数组
多维数组说明格式为:
类型说明符 数组名[size1][size2]…[sizen];
其中,size1,size2,…,sizen 为数组各维的大小。组成该组元素的总个数应为 size1×size2×…×sizen。
例如:
int d[10][20];
说明这是一个 10×20 二维数组,即:
d[0][0]d[0][1]…d[0][19]
d[1][0]d[1][1]…d[1][19]
…
d[9][0]d[9][1]…d[9][19]
例 3.2 将一个二维数组行和列元素互换,存入另一个二维数组里
void main () {
static int a[2][3]={{1,2,3},{4,5,6}};
static int b[3][2],i,j;
printf("array a : \n");
for (i=0;i<=1;i++)
/*循环变量作为行坐标*/ /*循环变量作为列坐标*/
{
for (j=0;j<=2;j++) {
printf("%5d",a[i][j]);
b[j][i]=a[i][j];
/*行列互换*/
}
printf("\n");
}
printf("array b : \n");
for (i=0;i<=2;i++) {
/*循环变量作为行坐标*/ /*循环变量作为列坐标*/
for (j=0;j<=1;j++)
printf("%5d",b[i][j]);
printf("\n");
}
}
3.3 数组元素初始化
1.数组的初始化
C 语言允许在说明时对全局数组和静态数组初始化,即给各个元素赋以初始值,例如:
void main()
{
static int counters[5]={0,1,2,3,4};
static char letters[5]={‘a’,’b’,’’c,’d’,’e’};
static int M[4][5]={{10,5,-3,-17,82},{9,0,0,8,-7}{32, 10,20,1,14},{0,0,8,7,6}};
static int x[5]={0,1,2}; /*后面两个默认为 0*/
…
}
当给出初始值的个数少于数组全部元素个数时,未列出的后若干个初始值默认为 0。 2.变长数组的初始化
有时,不直接给出数组大小,作为变长数组出现,也照样可以初始化。例如:
static int a[]={1,2,3,4,5};
ststic float f[]={1.2,2.5,3.8,4.0};
static char word[]={‘H’,’e’,’1’,’1’,’o’,’’,’\0’};
static char error[]={“read error\n”};
3.4 字符串
字符串要用一维字符数组处理, 实质上就是以空字符结尾的字符数组。
1.以空字符结尾的字符数组
空字符就是 NULL,即’\0’。一个字符串可看成结尾为’\0’的不定长的一维字符数组。例如:
“a”等同于’a’,’\0’
““等同于’\0’
“ “等同于’’,’\0’
“Hello!\n”等同于’H’,’e’,’1’,’1’,’o’,’!’,’\n’,’\0’
2.字符串常量
字符串常量是由一对双引号包括的除双引号之外的任何字符集合,也可看成一维的字符 数组常量。若要包括双引号必须加反斜线“\”。
3.字符串的初始化
可采用类似于变长数组初始化处理。 (1) 变长数组初始化,例如:
static int A[]={0,1,2,3,4};
(2) 字符串初始化,例如:
static char x[]={‘H’,’e’,’l’,’l’,’0’,’!’,’\0’};
由于是字符数组,可以直接用字符数组常量即字符串常量给出初始值,编译器将自动加 入空字符’\0’。显然,下面这样将更简便些;
static char x[]={“Hello ”};
4.字符串的显示
可用%s 的格式显示一个以’\0’结尾的字符串。系统显示字符串遇到空格符’\0’时,就结
束该字符串的显示。例如:
static char x[]={“Hello!”};
printf(“%s\n”,x);
此语句的执行结果,将显示: Hello!
5.字符串的输入
可用%s 的格式输入一个字符串。例如:
char s1[20];
scanf(“%s”,s1);
注意:·在 s1 前,不加“&”。
·输入字符串时,遇到空格或回车则结束。
6.单字符的输入
用 scanf()输入字符或字符串时,遇到空格或回车结束。这不便于文字处理,一般用
getchar()函数输入单字符。例如:
void main
{
char ch;
ch=getchar();
}
7.转义字符
一些特殊字符,须用反斜线来转义,例如:
\0 NULL \b 退格
\n 回车换行 \r 回车不换行
\t 横向制表 \v 纵向制表
\’ 单引号 \” 双引号
\f 换页 \\ 反斜线
例 3.3 输出一个钻石图形。
main ()
{static char diamond[ ][5]={{' ',' ','*'},{' ','*',' ','*'},{'*',' ',' ',' ','*'},{' ','*',' ','*'},{' ',' ','*'}}; int i,j;
/*第二维大小不能省略*/
for (i=0;i<5;i++) {
/* 逐行 */
for (j=0;j<5;j++)
/*逐列*/
printf("%c",diamond[i][j]); printf("\n");
} }
运行结果
*
* *
* *
* *
*
例 3.4 统计输入的一段文字有多少个单词。
int main ()
{
char string[81];
int i,num=0,word=0;
char c;
gets(string);
/* 输入一段文字到一维数组 string */
for (i=0;(c=string[i])!='\0';i++)
if (c==' ')
word=0;
else if (word==0) /* c 不为空格,但上次 c 为空格,出现单词 */
{
word=1;
num++; }
/*单词数累加*/
printf("There are %d words in the line\n", num);
}
3.5 字符串函数
一般 C 语言编译器都提供了字符串函数,放在文件 string.h 中,要使用字符串函数必须 加有包含文件 string.h,即写成:
3.6 字符函数和字符转换及运算
1. 字符函数
一般 C 语言编译器的字符函数放在文件 ctype.h 中,要使用时必须加上包含文件 ctype.h,
即写成:
这类函数主要是用于字符类别判断及转换,例如:
isalnum(ch) 若 ch 为字母或数字,则返回非零值;否则,返回零。
islower(ch) 若是小写字母,则返回非零值;否则,返回零。
tolower(ch) 将大写字母转换成小写字母
例 3.5 利用二维数组,找出三个字符串的最大者(ASCII 值)。
int main () {
char string[20];
char str[3][20]; int i;
/*每行一个字符串*/
for (i=0;i<3;i++)
gets (str[i]);
/* 分别读入三个字符串*/
if (strcmp(str[0],str[1])>0) /* 字符串比较 */
strcpy(string,str[0]); /* 字符串 str[0]复制到 string */
else strcpy(string,str[1]);
if (strcmp(str[2],string)>0)
strcpy(string,str[2]);
printf("\nthe largest string is:\n%s\n",string);
}
|