null第四章 简单构造数据类型 第四章 简单构造数据类型 第四章 简单构造数据类型第四章 简单构造数据类型4.1 一维数组的引出及使用
4.2 二维数组的引出及使用
4.3 字符数组
4.4 数组与函数
4.5 数组与指针
4.6 字符串与指针
4.7 典型例题4.1 一维数组的引出及使用4.1 一维数组的引出及使用例:某班有30名学生,求该班成绩的平均分#include
void main( )
{ int i, s, sum=0 ;
float ave ;
for(i=1; i<=30 ; i++)
{ scanf(“%d”, &s);
sum=sum+s;
}
ave=sum/30;
printf(“ave=%f”, ave);
}这里只使用了一个变量s,虽然通过循环我们输入了30个学生的成绩,但循环结束后s中只是第30个学生的成绩,前面29个学生的成绩都没有保存下来如果要求保存这30名学生的成绩,最后再输出,应该怎么办?null思考?
S0、S1、S2、……、S29数组:由具有相同类型的固定数量的元素组成的集合
数组元素: 每一个数组元素都是一个变量, 用数组名和下标唯一地确定数组元素。为了与一般的变量相区别,我们称数组元素为下标变量
下标变量在数组中的位置序号称下标。
数组中的每个元素属于同一类型null一维数组的定义
格式:类型标识符 数组名 [ 常量
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
达式 ] ;
例:int a[10];
说明
数组名要符合合法标识符的命名规则
数组长度指数组中元素的个数,由常量表达式的值确定
数组的类型实际上是指数组元素的取值类型。对于同一个数组,所有元素的数据类型都是相同的
数组的下标从0开始
例: int a[10]中a有10个元素,所以数组长度为10,
数组元素分别是: a[0], a[1] … a[8],a[9]null说明(续)
常量表达式中可包括常量和符号常量,但不能包含变量和实数
int n;
scanf("%d",&n);
int a[n]; int n=6;
int a[n]; int b[8.5]; #define SIZE 8
…
int a[2+3];
float b[SIZE];说明(续)
数组名表示了一个存储区的首地址(即第一个数组元素的地址)
例: 一个变量x的地址可以用&x来表示;
一个数组a的地址就用数组名a来表示,
a等价于&a[0]对null数组元素的引用
形式:数组名[ 下标 ]
说明
下标可以是整型常量或整型表达式
如: a[1] , a[2*3]
C语言规定只能逐个引用数组元素而不能一次引用整个数组
对下标的引用不要超过下标的最大值
例:a[5], 最大只能到a[4]#include
void main( )
{
int j , sum=0 , s[30] ;
float ave ;
for(j=0; j<=29 ; j++)
{ scanf(“%d”, &s[j]);
sum=sum+s[j];
}
ave=sum/30;
printf(“ave=%f”, ave);
for(j=0; j<30 ; j++)
printf(“%d,”, s[j]);
} null一维数组的初始化
概念:在定义一维数组时对各个元素指定初始值称为数组的初始化
例: int a[5] = { 1 , 3 , 5 , 7 , 9 } ;
说明
对数组的全体元素指定初值, 初值用 { } 括起来, 数据之间用逗号分开。这种情况下, 可以不指明数组的长度, 系统会根据{ }内数据的个数确定数组的长度。
例:int a[ ] = { 1 , 3 , 5 , 7 , 9 } ;
对数组中部分元素指定初值 ( 这时不能省略数组长度 )。例:int a[5] = { 1 , 3 , 5 };
使数组中的全部元素初始值都为 0。
例:int a[5] = { 0, 0, 0, 0, 0 } ; 简写为: int a[5]={ 0 } ;null
找到x后结束循环例4-1: 输入一个数据,在已知数组中查找是否有该数据9a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
a[6]
a[7]
a[8]
a[9]#include
void main( )
{ int i , x ;
int a[10]={ 5, 8, 0, 1, 9, 2, 6, 3, 7, 4 };
scanf(“%d”, &x);
for ( i=0 ; i<10 ; i++)
if ( x= =a[i] )
{ printf(“find! a[%d]=x\n”, i);
break;
}
if ( i= =10 )
printf(“no find!\n”);
} null例4-2: 用冒泡排序法对6个数进行排序(从小到大)a[0]
a[1]
a[2]
a[3]
a[4]
a[5]277547145151412冒泡排序方法: 依次比较相邻的两个数,将小数放前面,
大数放后面. n个数排序需要进行n-1轮比较, 从第1轮到
第n-1轮, 各轮的比较次数依次为:n-1次、n-2次 … 1次9999972541初始状态第1轮第2轮第3轮第4轮第5轮7null#include
void main( )
{ int a[6] , i , j , t;
for ( i=0 ; i<6 ; i++)
scanf(“%d”, &a[i] );
for ( i=0 ; i<6-1 ; i++)
for ( j=0 ; j<6-1-i ; j++)
if ( a[j]>a[j+1] )
{ t=a[j] ;
a[j]=a[j+1] ;
a[j+1]=t ;
}
for ( i=0 ; i<6 ; i++)
printf( “%3d”, a[i] );
}输入6个数据用嵌套的for循环实现排序
外层循环控制进行几轮比较
内层循环控制每一轮的比较次数若前面的数大于后面的数,则进行交换输出排序后的6个数据null例4-3: 用选择排序法对6个数进行排序(从小到大)a[0]
a[1]
a[2]
a[3]
a[4]
a[5]79574524795745729712初始状态第1轮第2轮第3轮第4轮第5轮795779选择排序方法: 第1轮比较时,用a[0]依次与a[1]到a[5]
进行比较,如果a[0]较大则进行交换,第1轮结束后,a[0]
中为最小数. 以后各轮比较过程与第1轮类似.null#include
void main( )
{ int a[6] , i , j , t;
for ( i=0 ; i<6 ; i++)
scanf(“%d”, &a[i] );
for ( i=0 ; i<6-1 ; i++)
for ( j=i+1 ; j<6 ; j++)
if ( a[i]>a[j] )
{ t=a[i] ;
a[i]=a[j] ;
a[j]=t ;
}
for ( i=0 ; i<6 ; i++)
printf( “%3d”, a[i] );
}null冒泡程序的改进a[0]
a[1]
a[2]
a[3]
a[4]
a[5]第1轮第2轮第3轮第4轮第5轮初始状态从这道例题中我们发现,在进行完第二轮后,数据就排好序了,
在第三轮中数据没有进行一次交换,说明排序已经完成了,
第四、五轮的比较都是多余的,这种情况下应该终止排序过程null为了解决问题,在程序中设置一个变量flag, 用它记录在每一轮比较中是否进行了交换在每轮比较开始前flag=0,如果在此轮比较中进行了交换,则flag=1,在一轮比较结束后,判断flag的值是否为1,如果值为1,则继续进行排序; 如果值为0,说明在此轮比较中没有进行交换(即已经完成排序了), 此时可终止循环(即结束排序)#include
void main( )
{ int a[6] , i , j , t , flag;
for ( i=0; i<6; i++)
scanf(“%d”, &a[i] );
i=0 ;
do
{ flag=0;
for ( j=0 ; j<5-i ; j++)
if ( a[j]>a[j+1] )
{ t=a[j] ; a[j]=a[j+1] ;
a[j+1]=t ; flag=1;
}
i++ ;
} while ( flag ) ;
for ( i=0 ; i<6 ; i++)
printf( “%3d”,a[i] );
}null选择排序的改进方法
分析选择排序过程发现,在每一轮的比较中交换次数太多,我们可以尽量减少交换次数,实际上每轮比较只要一次进行交换就能完成排序。
改进方法:
先从要排序的n个数中找出最小的数,把它放在第一个位置
再从剩下的n-1个数中找出最小的数,把它放在第二个位置
这样重复做下去,即可
改进后的选择排序方法数据进行比较的次数并没有
减少,但每一轮只进行一次交换,加快了程序运行速度null#include
void main( )
{ int a[6] , i , j , k , t;
for ( i=0 ; i<6 ; i++)
scanf(“%d”, &a[i] );
for ( i=0 ; i<5 ; i++)
{ k=i ;
for ( j=i+1 ; j<6 ; j++)
if ( a[k]>a[j] ) k=j ;
if ( k!=i )
{ t=a[i] ; a[i]=a[k] ;
a[k]=t ;
}
}
for ( i=0 ; i<6 ; i++)
printf( “%3d”, a[i] );
}a[0]
a[1]
a[2]
a[3]
a[4]
a[5]0k1219 5!=0
a[0]和a[5]换5k1227 2!=1
a[1]和a[2]换 4!=2
a[2]和a[4]换k23447设置变量k用以存储当前最小数的下标4.2 二维数组的引出及使用4.2 二维数组的引出及使用二维数组的定义
概念:一个一维数组, 它的每一个元素都是类型相同的一维数组, 就形成一个二维数组
形式:
类型标识符 数组名 [常量表达式1] [常量表达式2]
例: int a[3][4] ;
a[0]
a[1]
a[2]null存储形式 : 数组的元素在内存中是连续存放的
例:int a[3][3] ; 数组a的存放形式如下 : a[1][0]a[1][1]a[1][2]a[2][0]a[2][1]a[2][2]a[0][0]a[0][1]a[0][2]a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
a[2][0]
a[2][1]
a[2][2]1010
1012
1014
1016
1018
1020
1022
1024
1026二维数组的引用
形式:数组名 [下标1] [下标2]
注意:
每个下标都要用 [ ] 括起来
如 a [2] [1] 不能写成 a [2,1]
下标不要超过定义的范围
null二维数组的初始化
分行初始化:
int a[3][4]={{ 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 }};
第1对{ }内的数据赋给第1行数组元素, 以此类推
1 2 3 4 5 6 7 8 9 10 11 12 按数据的排列顺序对数组元素赋初值
例:int a[3][4]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
将数据依次赋给元素 a[0][0] , a[0][1] …a[2][3] null对数组的部分元素赋初值int a[3][4]={1,2,3,4,5,6}; int a[3][4]={{1, 2},{3},{0, 4}}; 对数组的全部元素赋初值时可以省略第一维的长度,系统会根据数据的个数和第二维的长度自动求出第一维的长度数组a第一维长度为 3 数组b第一维长度为 4 int a[ ][4]={ {1, 2}, { 0, 3, 4 }, { 5 } } ;
int b[ ][2]={ 1, 2, 3, 4, 5, 6, 7, 8 } ;null例4-4: 找出矩阵中最大的数,并输出其行号和列号#include
void main( )
{ int i , j, row=0, col=0, max ;
int a[3][4]={{5,2,0,9},{3,7,12,6},{10,4,1,8}};
max=a[0][0];
for ( i=0; i<3; i++ )
for ( j=0; j<4; j++ )
if ( a[i][j]>max )
{ max=a[i][j] ;
row=i ; col=j ;
}
printf(“max=%d\n”, max);
printf(“max=a[%d][%d]\n”, row , col);
}max0row0col59301212输出:
max=12
max=a[1][2]null#include
void main( )
{ int a[3][4], b[4][3] , i , j ;
for ( i=0 ; i<3 ; i++ )
for ( j=0 ; j<4 ; j++ )
scanf(“%d”, &a[i][j] ) ;3
7
12
610
4
1
85
2
0
9输入数组a进行矩阵转置a[0][2]b[2][0]a[2][1]b[1][2]输出数组bfor ( i=0 ; i<3 ; i++ )
for (j=0 ; j<4 ; j++)
b[j][i]=a[i][j]; for ( i=0 ; i<4 ; i++ )
{ for ( j=0 ; j<3 ; j++ )
printf(“%5d”, b[i][j]) ;
printf(“\n”);
}
}例4-5:将一个矩阵进行转置(即原来的行变为列)4.3 字符数组4.3 字符数组字符数组和字符串
字符数组的定义:char 数组名[字符个数]
例: char c[10];
字符串:由若干个有效字符组成的序列,有效字符包括字母, 数字, 专用字符, 转义字符等
例 : “bfer” “a45-7” “m\tk\n”
字符串的存储:C语言中没有专门的字符串变量, 因此字符串存放在字符数组中, 字符串以“\0”作为结束标志
nullchar c[8] = { “Hello” } ;
char c[8] = “Hello” ;
char c[8] = { ‘H’,‘e’,‘l’,‘l’,‘o’,‘\0’ } ;char c[ ] = “Hello”;char c[6]=“Hello”; char c[5] = “Hello”;注意: 初始化时数组长度应足够大, 确保可以容纳所有字符和‘\0’字符数组的初始化:为数组中的元素指定初值
例:char c[7] = { ‘H’,‘e’,‘l’,‘l’,‘o’ } ;
如果对数组全部元素指定初值, 则可省略数组的长度
例: char c[ ] = {‘H’ , ‘e’ , ‘l’ , ‘l’ , ‘o’ } ;对字符数组指定字符串初值null字符串的输入
输入单个字符 例: char c[8] ; int i ;
for ( i=0 ; i<8 ; i++ )
scanf(“%c” , &c[i] ) ;
输入一个字符串: scanf ( “%s” , c ) ;
字符串输入函数: gets (字符数组)
例 : gets(c) ;
说明
用格式字符 %s 输入字符串时, 字符数组变量c不必加地址符& , 因为数组名本身代表数组的首地址
从键盘输入字符串时不加“ ”
用scanf 输入字符串时, 空格和回车符都会作为字符串的分隔符,即scanf不能用来输入包含有空格的字符串null int i ;
char c[8];
① for ( i=0 ; i<8 ; i++ )
scanf(“%c”,&c[i]) ;
② scanf(“%s” , c ) ;
③ gets ( c ) ; 例: 假设输入为: abc def↙说明: 输入有空格的字符串时应使用函数gets , 它会读入全部字符直到遇到回车符为止null字符串的输出
输出单个字符:
char c[8]= “hello”; for ( i=0 ; i<8 ; i++ )
printf( “%c%c” , c[0] , c[1] ) ; printf( “%c” , c[i] ) ;
输出字符串: printf( “%s” , c ) ;
字符串输出函数: puts ( 字符数组 )
一次输出一个字符串, 输出时将‘\0’自动转换成换行符
注意:
输出时不包括字符‘\0’, 如果一个字符串中有多个‘\0’ , 则输出时遇到第一个‘\0’即认为字符串结束 null例: char s1[5]=“abc”, s2[10]=“defg” ;
printf( “%s%s\n” , s1 , s2 ) ;
puts( s1 ) ;
puts( s2 ) ;输出:
abcdefg
abc
defg int i ;
char c[8];
gets ( c ) ;
for ( i=0 ; i<8 ; i++ )
printf(“%c”, c[i] );
printf(“\n”)
puts ( c ); 例: 假设输入为: abc defgh↙输出:
abc defg
abc defgh注意: 用gets输入字符串时, 若输入字符数目大于字符数组的长度, 多出的字符则会存放在数组的合法存储空间之外null
错// 赋值与初始化不同 // 对s2,s3的赋值都是非法的 字符串处理函数 (要加#include )
字符串复制函数 :strcpy( 字符数组变量1 , 字符串2 )
作用 : 将字符串2中的字符复制到字符数组1中
注意 :
字符数组1 必须足够大
字符串2可以是字符串常量, 或是字符数组变量
拷贝时‘\0’也一起拷贝 例: char s1[5]=“abc” , s2[3] , s3[8] ;
s2 = “abc” ;
s3 = s1 ; 注意: C语言不允许用赋值表达式对字符数组赋值
如果想让s2或s3中也存放字符串“abc”,则 要用字符串拷贝函数 null例: char s1[5]=“abc” , s2[3] , s3[8] ;
strcpy ( s3 , s1 ) ;
strcpy ( s2 , s1 ) ;s1s3s2c1c2字符串复制函数的扩展格式 :
strncpy( 字符数组1 , 字符串2 , n )
作用: 将字符串2的前n个字符复制到字符数组1 中
例: char c1[10]=“program” , c2[ ]=“abcdef” ;
strncpy( c1 , c2 , 3 ) ;null例: char s1[10]=“abc” , s2[ ]=“def” ;
strcat ( s1 , s2 ) ;
strcat ( s1 , “gh” ) ; s1s2def\0gh\0字符串连接函数
格式: strcat ( 字符数组变量1 , 字符串2 )
作用: 将字符串2中的字符连接到字符串1 的后面,产生的新字符串仍存放在字符数组1 中
说明:
连接时将字符串1 末尾的‘\0’将去掉 , 而在连接后的新字符串末尾添加‘\0’
注意: 字符数组1要足够大nullstr1 = = str2 函数值为0
str1 > str2 函数值为正数
str1 < str2 函数值为负数字符串比较函数
格式 : strcmp ( 字符串1 , 字符串2 )
作用 : 比较两个字符串的大小
说明 :
两个字符串可能是字符串常量或字符数组变量
两个字符串比较时, 从字符串中的第一个字符开始逐个比较其ASCII码值, 直到出现不同字符或出现‘\0’为止
比较的结果由函数值带回对两个字符串比较,不能以下形式:
if(str1==str2) printf(“yes”);
而只能用:
if(strcmp(str1,str2)==0)
printf(“yes”);null例: char s1[5] , s2[5] ;
if(strcmp (“abc”, “def”)<0)
printf(“yes”);
strcpy( s1 , “dfg” ) ;
strcpy( s2 , “you” ) ;
if(strcmp ( s1 , “def” )==0)
printf(“equal”);
if(strcmp ( s1 , s2 )>0)
printf(“big”); 字符‘a’与‘d’比较
先‘d’与‘d’比较, 相同,
然后‘f ’与‘e’比较字符‘d’与‘y’比较s1s2null例 : int len1, len2 ;
char s[10] ;
len1 = strlen( “computer”) ;
gets(s) ;
len2 = strlen(s) ;测字符串长度函数
格式: strlen (字符串)
作用: 测出字符串中实际字符的个数( 不包括‘\0’ )
字符串中大、小字母转换
strlwr (字符串) : 将字符串中大写字母换成小写字母
strupr (字符串) : 将字符串中小写字母换成大写字母null10101例4-6:输入一行字符, 统计其中有多少个单词 分析:
用一个字符数组来保存一行字符,因为单词是由空格分开的, 所以统计单词个数关键在于判断某个字符是否为空格
具体方法:
设置一个标志变量word, 如果当前字符是空格, 则word=0; 如果当前字符不是空格, 则word=1null#include
void main( )
{ char string[81];
int i, num=0, word=0;
char c;
gets(string);
for(i=0; (c=string[i])!= '\0'; i++)
if (c==' ') word=0;
else if (word==0)
{ word=1;
num++;
}
printf (“There are %d words.\n”, num);
} num用来统计单词个数, word是判别是否为单词的标志, 若word=0表示未出现单词, 如出现单词word就置成1c不是空格, 若c前面的字符是空格, 表明这是一个新单词的开始, 则word=1, num加1; 若c前面的字符不是空格, 则不作任何处理nullxy7\0s2s1目标: 将字符串s2 连接到字符串s1后面例4-7:编程实现两个字符串的连接, 但不能使用strcat函数步骤:
让数组s1 的下标指向字符串的末尾, 即‘\0’的位置
依次将数组s2 的字符赋给s1, 它们的下标都加1
最后数组s1 的末尾赋值为‘\0’null#include
void main( )
{ char s1[80], s2[40];
int i=0, j=0;
printf(“Input string1:”); gets(s1);
printf(“Input string2:”); gets(s2);
while(s1[i]!='\0')
i++;
while(s2[j]!='\0')
s1[i++]=s2[j++];
s1[i]='\0';
printf(“The new string is: %s”, s1);
} i 和j分别是s1 和s2的下标当元素i不是‘\0’ 时,
让i加1,指向下个元素依次将s2的元素j赋给s1的元素is1[i]=s2[j];
i++; j++;S1末尾赋‘\0’4.4 数组与函数4.4 数组与函数数组元素作函数参数
其用法与变量作参数一样, 是单向传递
数组名作函数参数
实参和形参都使用数组名
说明
必须在主调函数和被调函数中分别定义数组
实参数组和形参数组的类型必须一致
数组名作参数就是将实参数组的首地址传给形参数组,即实参数组和形参数组占用同一片内存单元
定义形参数组时可以不指定其大小,当形参数组发生变化时, 实参数组也随之发生变化 null例4-8-1: 求某班成绩的平均分#include
float average(int a[40]);
void main( )
{ int i , s[40] ; float aver ;
for(i=0; i<=39 ; i++)
scanf(“%d”, &s[i]);
aver=average(s);
printf(“aver=%f\n”, aver);
} float average(int a[40])
{ int i ;
float sum , ave ;
sum=0;
for(i=0; i<=39 ; i++)
sum=sum+a[i];
ave=sum/40;
return(ave);
} 数组占用
存储空间 s[0]
s[1]
s[2]
:
:
:
:
s[39]mainaveragea[0]
a[1]
a[2]
:
:
:
:
a[39] 78
84
90
:
:
:
:
66null例4-8-2:形参数组不指定长度的使用方法#include
float average(int a[ ], int n);
void main( )
{ int i , s[40] ; float aver ;
for(i=0; i<=39 ; i++)
scanf(“%d”, &s[i]);
aver=average(s, 40);
printf(“aver=%f\n”, aver);
} float average(int a[ ], int n)
{ int i ;
float sum , ave ;
sum=0;
for(i=0; i
void main( )
{ int a[5]={1, 3, 5 ,7 ,9 }, *p , i ;
for( i=0; i<5; i++)
printf(“%3d”, a[i]);
printf(“\n”) ;
for(i=0; i<5; i++)
printf(“%3d”, *(a+i));
printf(“\n”) ;
for (p=a; p
void main( )
{ int a[5] = {1, 3, 5 ,7 ,9 },
int *p , j ;
for ( p=a ; p
void inv1( int x[ ] , int n )
{ int temp, i , j , m=(n-1)/2;
for( i=0 ; i<=m; i++)
{ j=n-1-i ; temp=x[i] ;
x[i]=x[j]; x[j]=temp ;
}
}
void main( )
{ int i , a[6]={ 1, 3, 4, 6, 7, 9 };
inv1(a , 6 );
for( i=0; i<6; i++ )
printf(“%3d”, a[i] );
printf(“\n”);
}a[0]
a[1]
a[2]
a[3]
a[4]
a[5]x[0]
x[1]
x[2]
x[3]
x[4]
x[5]maininv19114736423数组名作函数参数: ① 实参和形参都用数组名null#include
void inv2(int *x , int n)
{ int temp, m=(n-1)/2;
int *p , *i , *j ;
i=x ; j=x+n-1; p=x+m;
for( ; i<=p ; i++, j-- )
{ temp=*i ; *i=*j ;
*j=temp ; }
}
void main( )
{ int i , a[6]={ 1, 3, 4, 6, 7, 9 };
inv2(a , 6 );
for( i=0; i<6; i++ )
printf(“%3d”, a[i] );
printf(“\n”);
}a[0]
a[1]
a[2]
a[3]
a[4]
a[5]inv29173641a+1a+4a+2a+334a+3a+2例4-16 ②实参用数组名, 形参用指针变量null例4-16: ③实参和形参都用指针变量
#include
void inv3(int *x , int n);
void main( )
{ int *p , a[6]={1, 3, 4, 6, 7, 9};
p = a ;
inv3( p , 6 );
for( p=a ; p
void inv4(int x[ ] , int n);
void main( )
{ int *p, a[6]={1, 3, 4, 6, 7, 9};
p = a ;
inv4( p , 6 ) ;
for( p=a ; p
int max , min ;
void m1(int arr[ ] , int n)
{ int *p , *end ;
end=arr+n ;
max=min=*arr ;
for(p=arr+1 ; pmax ) max=*p ;
else if( *p
void main( )
{ char a[20], b[20];
int i=0;
gets(a);
gets(b);
while((*(a+i) == *(b+i))&&*(a+i)!= '\0')
i++;
if(*(a+i)== '\0'&&*(b+i)== '\0')
printf(“%s = %s\n”, a, b);
else if(*(a+i)>*(b+i))
printf(“%s > %s\n”, a, b);
else
printf(“%s < %s\n”, a, b);
}方法1: 用字符数组实现ab1234例4-18:按字典排列法比较两个单词的大小null#include
void main( )
{ char a[20], b[20], *sa, *sb;
sa=a;
sb=b;
gets(sa);
gets(sb);
while((*sa == *sb) && *sa != '\0')
{ sa++; sb++; }
if(*sa == '\0'&&*sb == '\0')
printf(“%s = %s\n”, sa, sb);
else if(*sa>*sb)
printf(“%s > %s\n”, sa, sb);
else
printf(“%s < %s\n”, sa, sb);
}方法2: 用字符指针实现null例4-19-1: 实现字符串复制
void copystr(char from[ ] , char to[ ])
{ int i = 0 ;
while ( from[i]!=‘\0’ )
{ to[i] = from[i] ;
i++;
}
to[i] = ‘\0’;
}
void mani( )
{ char a[ ] = “cat” , b[ ] = “tiger”;
puts(a); puts(b);
copystr(a , b);
puts(a); puts(b);
}abcat\0相当于b[i]=a[i]字符串指针作函数参数null例4-19-2:
void copystr(char *from , char *to)
{ for( ; *from!=‘\0’ ; from++ , to++ )
*to = *from ;
*to = ‘\0’;
}
void main( )
{ char *a = “cat” , *b = “tiger”;
puts(a);
puts(b);
copystr(a , b);
puts(a);
puts(b);
} abcat\0a+1b+1a+2b+2a+3b+3